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(); } }
不得不说博客园的格式不好看...。

浙公网安备 33010602011771号