hdu 1789 任務排程 貪心或dp
又是喜聞樂見的符合sample但是wa
http://acm.hdu.edu.cn/showproblem.php?pid=1789
我的:
1.話說看看這個cmp要記住,本來cmp沒改連sample都不對
2.如果cb不能debug,重新安裝完全版
3.cb debug可能會進入algorithm標頭檔案中
4.我覺得錯誤也許在於隨意的交換可能浪費了某些資源
這道題貌似可以dp
#include <iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef struct homework
{
int d,r,f;
}Homework;
Homework h[1030];
int T,N;
int cmp(Homework a,Homework b)
{
if(b.r!=a.r)
{
return a.r>b.r;
}
else
return a.d<b.d;
}
int main()
{
scanf("%d",&T);
while(T-->0)
{
scanf("%d",&N);
int i;
for(i=0;i<N;i++)
{
scanf("%d",&h[i].d);
}
for(i=0;i<N;i++)
{
scanf("%d",&h[i].r);
}
sort(h,(h+N),cmp);
int day=0,cnt=0,red=0;;
int mark[1030]={0};
while(cnt<N)
{
day++;
if(day<=h[cnt].d)
{
mark[cnt]=1;
h[cnt].f=day;
//printf("%d finish h[cnt].d=%d\n",cnt,h[cnt].d);
}
else
{
int k,flag=0;
for(k=0;k<N;k++)
{
if(mark[k]&&h[k].d>=day&&h[k].f<=day)
{
mark[cnt]=1;
flag=1;
// printf("CHAGE:%d %d %d\n",h[k].d,day,h[k].f);
h[cnt].f=h[k].f;
h[k].f=day;
}
}
if(flag==0)
{
red+=h[cnt].r;
//printf("+%d\n",h[cnt].r);
day--;
}
}
cnt++;
}
printf("%d\n",red);
}
return 0;
}
別人的:
此題大致思路,既然要計算最少扣多少分,就要在最後時間之前把扣分最多的作業先安排了。如果扣分一樣多的話,那必然要把時間比較緊的先安排了。所以先按扣分的高低,由高向低排序,如果兩門課扣分相同就按他們的結束時間由低向高排序!然後安排即可!