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;
}

 

posted @ 2013-05-27 11:21  小仪在努力~  阅读(210)  评论(0编辑  收藏  举报