1. 程式人生 > 其它 >Codeforces Round #731 (Div. 3) C題

Codeforces Round #731 (Div. 3) C題

題目意思:a, b兩人同時操作某個檔案,0代表增加,大於零的數代表修改某一行的值,現在要求在不改變相對順序的形況下使得他們可以成功。

也就是說你可以在a中插入b,在b中插入a。但你不能改變各自的順序。

思路:暴力模擬,有0先放0,沒0就看誰小。某一組跑完後又單獨跑另外一組。要注意的是比較大小的那裡要寫<=,還有單單獨跑的那裡要找看又沒有0.

每次遇到0,k都要加1。

連結:https://codeforces.com/contest/1547/problem/C

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
#define ctx cout << "xxxxx" << endl
#define inf 0x3f3f3f3f
#define int long long
#define eps 0.000000001
#define forn for(int i = 1; i <= n; i++)
#define ct1 cout << -1 << endl;
const int INF = 0x3f3f3f3f;
const double pai = 3.141592653589;
const int maxn = 305;
int a[maxn], b[maxn];

void solve() {
int k, n, m;
cin >> k >> n >> m;
int cot_zero = 0, _max = 0;
for(int i = 1; i <= n; i++) {
cin >> a[i];
}
for(int i = 1; i <= m; i++) {
cin >> b[i];
}
int i = 1, j = 1;
vector<int> ans;
while(i <= n || j <= m) {
if(a[i] == 0 && i <= n) {
ans.push_back(0);
i++, k++;
continue;
}
if(b[j] == 0 && j <= m) {
ans.push_back(0);
j++, k++;
continue;
}
if(a[i] <= b[j] && i <= n && j <= m) {
if(a[i] > k){
ct1;
return ;
}else{
ans.push_back(a[i++]);
continue;
}
}else if(b[j] <= a[i] && i <= n && j <= m){
if(b[j] > k){
ct1;
return ;
}else{
ans.push_back(b[j++]);
continue;
}
}
if(i <= n){
for(; i <= n; i++){
if(a[i] > k){
ct1;
return ;
}else{

ans.push_back(a[i]);
if(a[i] == 0) k++;
}
}
}
if(j <= m){
for(; j <= m; j++){
if(b[j] > k){
ct1;
return ;
}else{

ans.push_back(b[j]);
if(b[j] == 0) k++;
}
}
}
}
for(int x : ans) cout << x << " ";
cout << endl;
}

signed main() {
int t;
cin >> t;
while(t--) {
solve();
}
}

不得不說部落格園的格式不好看...。