HDU_1789_Doing Homework again

开头死磕磕不出贪心策略,然后晚上回去后,突然想到如果我用一个vis数组要标识当天有没有用过,然后对于每个作业,我都选用它的deadline作为做作业的时间,那不就过了么。额,然后我早上就过来试试,然后发现第一组数据都过不了,突然觉得自己脑子进水,无奈我已经对师弟开下海口,说想出了贪心策略。我顿时觉得丢不起这个脸,><我一定要死磕出来!然后硬着头皮做,左想想右想想,连树状数组都打上去了,还是没有想出来。然后一怒,哪有老师那么变态把做作业的deadline设置在若干年以后的,这deadline的值绝对不会超过1000,然后暴力,把每个作业都尽可能在离deadline最近的、没有用过的一天做完。。。然后顺理成章的AC了^ ^

贪心策略:

把作业按照罚时从大到小排列,用一个vis[]数组标识当天有无用过,尽量选择离deadline最近的、没有用过的一天作为完成该作业的时间。

#include<iostream>

#include<cstdio>

#include<cstring>

#include<cmath>

#include<algorithm>

#include<string>

#include<queue>

using namespace std;

struct point

{

    int deadline,time;

}p[1005];

bool vis[1005];

bool cmp(point a,point b)

{

    return a.time>b.time;

}

int main()

{

    int t,n,i,j,k;

    scanf("%d",&t);

    while(t--)

    {

        memset(vis,0,sizeof(vis));

        scanf("%d",&n);

        for(i=0;i<n;++i)

        scanf("%d",&p[i].deadline);

        for(i=0;i<n;++i)

            scanf("%d",&p[i].time);

        sort(p,p+n,cmp);

        int ans=0;

        for(i=0;i<n;++i)

        {

            bool jud=0;

            for(j=p[i].deadline;j>0;--j)

            {

                if(!vis[j])

                {

                        vis[j]=1;

                        jud=1;break;

                }

            }

            if(!jud) ans+=p[i].time; //如果找不到那一天,就加罚时

        }

        printf("%d\n",ans);

    }

return 0;

}

 

你可能感兴趣的:(home)