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;

}

 

你可能感兴趣的:(delete)