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
",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;
}
原文地址:https://www.cnblogs.com/sola1994/p/4524881.html