又是喜闻乐见的符合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;
}
别人的:
此题大致思路,既然要计算最少扣多少分,就要在最后时间之前把扣分最多的作业先安排了。如果扣分一样多的话,那必然要把时间比较紧的先安排了。所以先按扣分的高低,由高向低排序,如果两门课扣分相同就按他们的结束时间由低向高排序!然后安排即可!