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























發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章