CF_2067_B. Two Large Bags
题目链接:https://codeforces.com/contest/2067/problem/B
题目大意:
有两个袋子,第一个袋子有 个数 ,第二个袋子没有数。你可以从第一个袋子选择一个数进行以下操作(二选一):
- 将其移至第二个袋子;
- 如果第二个袋子中有与之相同的数,则可以将其加一。
经过若干次操作后,能否使两个袋子中的数相同?
思路:
当两个袋子中有一样的数,第一个袋子才能更新这个一样的数,且更新的数是只增不减的
首先设一个桶数组记录两个袋子中每个数出现的个数,并从 到 遍历,若一个数只出现了 次说明无解,输出 NO,
没有出现过的不用管
否则至少留下两个,给这个数字留下两个数就刚好可以分配了,多出来的数全部加一,交给比它大 的数来处理,以此类推
代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<vector>
#include<queue>
#include<deque>
#include<stack>
#include<set>
#include<map>
#include<unordered_set>
#include<unordered_map>
#include<bitset>
#include<tuple>
#define inf 72340172838076673
#define int long long
#define endl '\n'
#define F first
#define S second
#define mst(a,x) memset(a,x,sizeof (a))
using namespace std;
typedef pair<int, int> pii;
const int N = 200086, mod = 998244353;
int n, m;
int a[N];
void solve() {
cin >> n;
vector<int> v(n + 2);
for (int i = 1; i <= n; i++) {
cin >> a[i];
v[a[i]]++;
}
for (int i = 1; i <= n; i++) {
if (v[i] == 1) {
cout << "No" << endl;
return;
} else {
v[i + 1] += max(0ll, v[i] - 2);
}
}
cout << "Yes" << endl;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
int T = 1;
cin >> T;
while (T--) solve();
return 0;
}

浙公网安备 33010602011771号