Description
Input
Each test case start with a positive integer N(1<=N<=1000) which indicate the number of homework.. Then 2 lines follow. The first line contains N integers that indicate the deadlines of the subjects, and the next line contains N integers that indicate the reduced scores.
Output
Sample Input
3 3 3 3 3 10 5 1 3 1 3 1 6 2 3 7 1 4 6 4 2 4 3 3 2 1 7 6 5 4
Sample Output
0 3 5
代码:
#include<stdio.h>
#include<algorithm>
#include <cstring>
using namespace std;
struct work
{
int data;
int score;
}a[1005];
int comp(struct work a,struct work b)
{
if(a.score!=b.score)//首先按照分数不同高->低排序
return a.score>b.score;
if(a.score==b.score)//分数相同时,日期小的先排序,因为日期小的可以提前做完再考虑日期大的,以便日期大的往前推 的时候不用再考虑日期小的有没有做完
return a.data<b.data;
}
int main()
{
int t,Find[1005];
scanf("%d",&t);
while(t--)
{
int i,n;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i].data);
}
for(i=0;i<n;i++)
{
scanf("%d",&a[i].score);
}
int cnt=0;
sort(a,a+n,comp);
memset(Find,0,sizeof(Find));
for(i=0;i<n;i++)
{
int day=a[i].data;
while(day)
{
if(!Find[day])// 从截止时间开始往前推,如果有一天没用过,这一天就做这一门课,这门课不扣分
{
Find[day]=1;
break;
}
day--;
}
if(day==0)
cnt+=a[i].score;
}
printf("%d\n",cnt);
}
return 0;
}