hdu1789(经典贪心)

题意:有t组测试数据,每组测试数据中有n门功课,第一排完成它们的时间限制,第二排是未在限制的时间内完成的要扣除的分数,然后是需要求扣的分数最少。

思路:一开始在想着用dp做,结果没有d出来,于是去看解题报告,发现可以用贪心做,但是我也没有想到思路......是这样的,对分数按从大到小排次序,然后枚举限定的时间,若是某一天没有被标记,就用这一天来完成这一门作业,若是枚举到0了,说明在限定时间内没有哪一天可以完成这门作业,那么就扣除这门课的分数......

具体看代码吧:

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
struct ss
{
    int time,p;
}t[100000];
int f[100000];
int cmp(const ss a,const ss b)
{
    if(a.p>b.p)
        return 1;
    else if(a.p==b.p&&a.time<b.time)
        return 1;
    else
        return 0;
}
int main()
{
    int text,n;
    scanf("%d",&text);
    while(text--)
    {
        scanf("%d",&n);
        memset(f,0,sizeof(f));
        int i;
        for(i=1;i<=n;i++)
            scanf("%d",&t[i].time);
        for(i=1;i<=n;i++)
            scanf("%d",&t[i].p);
        sort(t+1,t+1+n,cmp);
        int sum=0;
        for(i=1;i<=n;i++)
        {
            for(int j=t[i].time;j>=1;j--)
                if(!f[j])
                {
                    f[j]=1;
                    break;
                }
            if(j==0)
                sum+=t[i].p;
        }
        printf("%d\n",sum);
    }
    return 0;
}

 

posted @ 2013-05-15 19:55  紫忆  阅读(2586)  评论(0编辑  收藏  举报