D. Epic Transformation
Example
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
题目大意:一个数组里,可以同时删去两个不同的数,求数组最小长度
思路:统计每个数字出现的次数,只要最多的次数小于或等于后面的次数之和,最后要么剩下一个,要么不剩。如果大于,最后一定会剩下次数最多的那个数。
难点:用map统计每个数字出现的次数,再根据值排序,因为map不能这样做,所以先转存到vector里,再sort一下
代码:
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<map>
#include<vector>
#define int long long
#define endl '\n'
using namespace std;
bool cmp(pair<int,int>ma1,pair<int,int>ma2)
{
return ma1.second>ma2.second;
}
signed main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t;
cin>>t;
while(t--)
{
map<int,int>ma;
int n;
cin>>n;
for(int i=0;i<n;++i)
{
int a;
cin>>a;
ma[a]++;
}
vector<pair<int,int>>v(ma.begin(),ma.end());//转到vector里
sort(v.begin(),v.end(),cmp);
int sum=0;
vector<pair<int,int>>::iterator it;
for(int i=1;i<v.size();++i)
{
sum+=v[i].second;
}
if(v.begin()->second<=sum)
{
if(n&1)cout<<1<<endl;
else cout<<0<<endl;
}
else
{
cout<<v.begin()->second-sum<<endl;
}
}
return 0;
}
模拟样例的数据,会发现,起决定作用的是出现次数最多的数。再自己出几个例子,发现如果n是奇数,最后是1