Doing Homework again之贪心解题报告

Doing Homework again

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

Problem Description

Ignatius has just come back school from the 30thACM/ICPC. Now he has a lot of homework to do. Every teacher gives him adeadline of handing in the homework. If Ignatius hands in the homework afterthe deadline, the teacher will reduce his score of the final test. And now weassume that doing everyone homework always takes one day. So Ignatius wants youto help him to arrange the order of doing homework to minimize the reducedscore.

 

 

Input

The input contains several test cases. The first line ofthe 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 indicatethe number of homework.. Then 2 lines follow. The first line contains Nintegers that indicate the deadlines of the subjects, and the next linecontains N integers that indicate the reduced scores.

 

 

Output

For each test case, you should output the smallest totalreduced 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

题目大意:

       题目大概意思是说,有一个学生落下很多作业,但是他的老师纷纷给他下了最后期限,他必须在截止日期之前把作业做完,否则就要被扣掉相应的分数,当然每天只能做一项,输入数据包括T个案例,每个案例的第一行给出有几门功课未完成,第二行输入没门功课的截止日期,第三行给出每功课对应的分数。求他至少要被扣除的分数!

解题思路:

       大概过程是先按照分数对功课进行排序,如果分数相同的话那么按照截止日期比较早的排在前面,然后尽量将功课安排在截止日期那天,如果截止日期那天已安排了课程,就向前提一天,如果该课程截止日期之前都安排满了,那么该功课将被扣除相应的分数。

代码如下:

#include <iostream>

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

#include <string.h>

#include <algorithm>

 

using namespace std;

 

struct homework

{

   int dl;

   int sc;

};

 

int cmp(homework a,homework b)

{

   if(a.sc>b.sc)

       return 1;

   else if(a.sc==b.sc&&a.dl<b.dl)

       return 1;

   else

       return 0;

}

 

homework work[1005];

int flag[1005];

int main()

{

   int t,n,i,j,sum,line;

   cin>>t;

   while(t--)

    {

       cin>>n;

       for(i=0;i<n;i++)

       {

           cin>>work[i].dl;

       }

       for(i=0;i<n;i++)

       {

           cin>>work[i].sc;

       }

 

       sort(work,work+n,cmp);

       memset(flag,0,1005);

       sum=0;

 

       for(i=0;i<n;i++)

       {

           line=work[i].dl;

           for(j=line;j>0;j--)

                if(flag[j]==0)

                {

                    flag[j]=1;

                    break;

                }

           if(j<1)

                sum+=work[i].sc;

 

       }

       cout<<sum<<endl;

    }

   return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值