题意:http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=578&pid=1001
思路:讲述列从大到小排列 先把数量多的数字剪掉 最后遍历求和
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int num[100+10]; int cmp(int a,int b) { return a>b; } int main() { int n,m,temp; int i,j,k; while(scanf("%d",&n)!=EOF) { int ans=0; memset(num,0,sizeof(num)); for(i=0;i<n;i++) { scanf("%d",&temp); num[temp]++; } scanf("%d",&m); sort(num,num+n+1,cmp); for(i=0;i<=n;i++) { if(m==0||num[i]==0) break; if(m>=num[i]) { //printf("1...%d %d ",m,num[i]); m-=(num[i]-1); num[i]=1; //printf("2...%d ",m); } else if(m<num[i]) { num[i]-=m; m=0; } } for(i=0;i<n;i++) { if(num[i]!=0) ans++; else break; } //printf("%d %d... ",ans,m); if(m!=0) ans-=m; printf("%d ",ans); } return 0; }