Codeforces Round #634 (Div. 3) 比赛人数11922 慢慢的对Div. 3难度有了些感觉
[codeforces 1335C] Two Teams Composing 统计技能种类数量+统计同一技能最大数量
总目录详见https://blog.csdn.net/mrcrack/article/details/103564004
在线测评地址https://codeforces.com/contest/1335/problem/C
Problem | Lang | Verdict | Time | Memory |
---|---|---|---|---|
C - Two Teams Composing | GNU C++17 | Accepted | 77 ms | 1600 KB |
手工算法如下,可特别关注最后一组数据的生成过程
7
4 2 4 1 4 3 4
统计技能种类数量 4种不同技能
统计同一技能最大数量 技能1(数量1) 技能2(数量1) 技能3(数量1) 技能4(数量4)
选出 技能4(数量4) 作为 第2组
扣除技能4,还有4-1=3种不同技能 作为 第1组
发现,第2组数量4,第1组数量3
输出结果为3
5
2 1 5 4 3
统计技能种类数量 5种不同技能
统计同一技能最大数量 技能1(数量1) 技能2(数量1) 技能3(数量1) 技能4(数量1) 技能5(数量1)
选出 技能1(数量1) 作为 第2组
扣除技能1,还有5-1=4种不同技能 作为 第1组
发现,第2组数量1,第1组数量4
输出结果为1
1
1
统计技能种类数量 1种不同技能
统计同一技能最大数量 技能1(数量1)
选出 技能1(数量1) 作为 第2组
扣除技能1,还有1-1=0种不同技能 作为 第1组
发现,第2组数量1,第1组数量0
输出结果为0
4
1 1 1 3
统计技能种类数量 2种不同技能
统计同一技能最大数量 技能1(数量3)
选出 技能1(数量3) 作为 第2组
扣除技能1,还有2-1=1种不同技能 作为 第1组
发现,第2组数量3,第1组数量1
此时,可让第2组数量3,匀出1个数量给第1组
更新后的数据,第2组数量2,第1组数量2
输出结果为2
AC代码如下
#include <cstdio>
#include <algorithm>
#define maxn 200010
using namespace std;
int a[maxn],b[maxn];
int main(){
int t,n,i,tot,mx;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
mx=0,tot=0;
for(i=1;i<=n;i++)b[i]=0;
for(i=1;i<=n;i++)scanf("%d",&a[i]),b[a[i]]++;//统计同一技能数量
for(i=1;i<=n;i++){
if(b[i])tot++;//统计不同技能种类
mx=max(mx,b[i]);
}
tot--;
if(tot>=mx)printf("%d\n",mx);
else{//tot<mx
printf("%d\n",tot+(mx-tot>=2?1:0));//第2组匀给第1组
}
}
return 0;
}