HDU 1789 Doing Homework again

来源:互联网 发布:趣店 知乎 编辑:程序博客网 时间:2024/06/08 06:27
                                                                    Doing Homework again

Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 10584 Accepted Submission(s): 6210


Problem Description
Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Every teacher gives him a deadline of handing in the homework. If Ignatius hands in the homework after the deadline, the teacher will reduce his score of the final test. And now we assume that doing everyone homework always takes one day. So Ignatius wants you to help him to arrange the order of doing homework to minimize the reduced score.


Input
The input contains several test cases. The first line of the input is a single integer T that is the number of test cases. T test cases follow.
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
For each test case, you should output the smallest total reduced score, one line per test case.


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 <iostream>#include <algorithm>#include <cstring>#include <string>#include <cstdio>using namespace std;struct work{    int time;    int score;    bool flag;///记录一下是否可以完成某项作业} s[1005];///按照作业规定的时间进行排序,如果时间相等的话,则按照分数排序int cmp(work a,work b){    if(a.time!=b.time)        return a.time<b.time;    return a.score>b.score;}int main(){    int t;    scanf("%d",&t);    while(t--)    {        int n;        int flag;        scanf("%d",&n);        for(int i=0; i<n; i++)            scanf("%d",&s[i].time);        for(int i=0; i<n; i++)        {            scanf("%d",&s[i].score);            s[i].flag=true;///初始为1        }        sort(s,s+n,cmp);        int sum=0;        int k=1;        for(int i=0; i<n; i++)        {            if(s[i].time>=k)///如果规定的时间大于所经历的时间,则继续            {                k++;                continue;            }            int p=s[i].score;///如果遇到了低于经历的时间,则需与之前完成作业中的其他的作业比较            int pos=i;         ///记录此时的位置            for(int j=0; j<i; j++)            {                if(s[j].score<p&&s[j].flag)///找到其中扣的最少的分数                {                    p=s[j].score;                    pos=j;                 }            }            sum+=p;  ///将最少的扣分加在一起            s[pos].flag=false;///将为完成的作业置为0        }        printf("%d\n",sum);}return 0;}



0 0
原创粉丝点击