HDU 1789 Doing Homework again

                                                                    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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值