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;
}
标签:pq,队列,auto,LL,Codeforces,710,--,数组,Round
From: https://www.cnblogs.com/Vivian-0918/p/16621117.html