hdu 5210 Delete(打表 贪心)
题意: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\n",m,num[i]);
m-=(num[i]-1);
num[i]=1;
//printf("2...%d\n",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...\n",ans,m);
if(m!=0)
ans-=m;
printf("%d\n",ans);
}
return 0;
}

浙公网安备 33010602011771号