Codeforces Round #710 (Div. 3) D. Epic Transformation(优先队列)

https://codeforces.com/contest/1506/problem/D

鉴定完毕,这题卡映射数量到优先队列的那一步操作

给你一个由整数组成的长度为n的数组a。您可以对阵列应用由几个步骤组成的以下操作零次或多次:

你在数组ai和aj中选择两个不同的数;
从数组中移除第I个和第j个元素。
在对数组应用一些操作序列后,数组的最小可以是多少?
input
5
6
1 6 1 1 4 4
2
1 2
2
1 1
5
4 5 4 5 4
6
2 3 2 1 3 1
output
0
0
2
1
0
  • 简而言之,题目意思就是想让我们两两不同的数字一起删除,可以操作任意次,问我们能留下的最小数量是多少?

  • 之前做过一个类似的题目,可惜卡常了,呜呜呜呜,但是大体还是一致的,都是使用优先队列进行删除匹配

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
const LL N=200200,M=2002;
LL a[N];
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    LL T=1;
    cin>>T;
    while(T--)
    {
        LL n;
        cin>>n;
        map<LL,LL> mp;
        for(LL i=1;i<=n;i++)
        {
            cin>>a[i];
            mp[a[i]]++;
        }
        priority_queue<int> pq;
        for(auto i:mp)
        {
            //插入的是不同的数字的个数
            pq.push(i.second);
        }
        while(pq.size()>=2)
        {
            auto x=pq.top();
            pq.pop();
            auto y=pq.top();
            pq.pop();
            x--;
            y--;
            if(x>0) pq.push(x);
            if(y>0) pq.push(y);
        }
        if(pq.size()==0) cout<<"0"<<endl;
        else cout<<pq.top()<<endl;

        mp.clear();
        while(!pq.empty()) pq.pop();
    }
    return 0;
}
posted @ 2022-08-24 17:59  高尔赛凡尔娟  阅读(27)  评论(1编辑  收藏  举报