hdu 1789 Doing Homework again (贪心)

题目大概意思是:一共有n个工作,每个作业需要一天完成,在截止时间d[i]内完成否则扣分
求最少扣的分数
解题思路:首先按照截止时间排序,如果截止时间相同,则按照扣分的大小从大到小排序
如果某天只有一个作业需要完成则直接赋值,如果某天是多个作业的截止时间,则从第一天到这天开始
遍历,找出从第一天到这一天的最小记录,与这一天的其他作业相比较,如果大于最小记录,则赋值
嘴太笨了~~~~
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define maxnum 1055
int sign[maxnum];
int n;
struct thenode
{
int dl;
int rd;
};
thenode tim[maxnum];
int cmp(thenode a,thenode b)
{
if(a.dl<b.dl)
return 1;
else if(a.dl==b.dl)
{
if(a.rd>b.rd)
return 1;
else return 0;
}else return 0;
}
int main()
{
int t,i,j;
int sum;
int min;
int u;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
memset(sign,0,sizeof(sign));
for(i=0;i<n;i++)
scanf("%d",&tim[i].dl);
for(i=0;i<n;i++)
scanf("%d",&tim[i].rd);
sort(tim,tim+n,cmp);
sum=0;
for(i=0;i<n;i++)
{
if(!sign[tim[i].dl])
{
sign[tim[i].dl]=tim[i].rd;
}else 
{
min=tim[i].rd;
u=-1;
for(j=1;j<=tim[i].dl;j++)
{
if(min>sign[j])
{
min=sign[j];
u=j;
}
}
sum+=min;
if(u>0)
sign[u]=tim[i].rd;
}
}
printf("%d\n",sum);
}
return 0;
}























你可能感兴趣的:(工作,homework,ini,作业)