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;

}

 

你可能感兴趣的:(HDU)