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