--- 这里是 cjiaw 的小窝(●'◡'●) ---

正在玩命加载中......

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;
}

 

posted @ 2025-10-11 18:15  wwjjw  阅读(16)  评论(0)    收藏  举报