ACM Doing Homework again

Ignatius刚刚从第30届ACM / ICPC回到学校。现在他有很多作业要做。每个老师给他一个截止作业的截止日期。如果Ignatius在截止日期之后进行了家庭作业,老师将减少他的最终考试成绩。现在我们假设做每个老师的作业总是需要一天的时间。以Ignatius希望你帮他安排做作业的顺序来减少分数的减少。

输入

每个测试用例从正整数N(1 <= N <= 1000)开始,表示作业数。然后两行。 第一行包含N个整数,表示作业的期限,下一行包含N个整数,表示减少的分数。
输出

对于每个测试用例,应该输出减少的最小总分数,每个测试用例一行。

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
Ignatius比赛回来之后,每位老师给Ignatius一个交作业的最后期限,如果交不上去就扣分。每门作业都要一天时间完成,求最少扣多少分。先输入一个T表示有T组测试数据,接下来每组数据先输入一个N,代表有N个作业,然后输入两行,第一行表示每门作业要交的日期,第二行表示对应的如果不交这门作业要扣的分数。输出要扣的最少分数。
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 struct node{
 4     int dayline;
 5     int descore;
 6     bool flag;
 7 }homework[1005];
 8 bool cmp(node a,node b)
 9 {
10     if(a.dayline!=b.dayline)
11         return a.dayline < b.dayline;  /*按期限从短到长排序*/
12     else
13         return a.descore>b.descore;  /*如果期限相同,按被扣分数从高到低来排序*/
14 }
15 
16 int main()
17 {
18     int t,n,temp;
19     while(cin>>t)
20     {
21         while(t--)
22         {
23             scanf("%d",&n); /*作业的数量*/
24             for(int i = 0; i < n; i++)  /*读取作业的期限*/
25                 scanf("%d",&homework[i].dayline);
26             for(int i = 0; i < n; i++) /*读取未完成作业被扣除的分数*/
27             {
28                 scanf("%d",&homework[i].descore);
29                 homework[i].flag = true; /*标记可完成*/
30             }
31 
32             sort(homework,homework+n,cmp);
33             int ans = 0; /*统计被扣除的分数*/
34             int day = 1; /*截止日期*/
35             for(int i = 0; i < n; i++)
36             {
37                if(homework[i].dayline >= day)
38                    day++;
39                 else{
40                     int p = homework[i].descore;
41                     int temp = i;
42                     for(int j =0; j < i; j++)  /*往前面搜索,查找是否有被扣分数较小的*/
43                         if(homework[j].descore < p && homework[j].flag) /*被扣分数较少 并且是可完成的(用来完成被扣分较大的作业)*/
44                         {
45                             p = homework[j].descore;
46                             temp = j;
47                         }
48 
49                     ans += p;
50                     homework[temp].flag = false;  /*标记不可完成*/
51                 }
52 
53 
54             }
55             cout<<ans<<endl;
56         }
57     }
58     return 0;
59 }

 

posted @ 2017-08-17 15:19  听说这是最长的名字了  阅读(372)  评论(0编辑  收藏  举报