1410291558-hd-Doing Homework again



Doing Homework again

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


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
 题目大意
        有一定的家庭作业。每一个作业都有截止日期和价值分数。如果作业没有做完,老师将会在总成绩中扣除该作业的价值分数。每天只能做一个,要求出其最少被扣除的分数。
解题思路
      

1.先按所扣分数的高低降序排序,分数一样的时候就按截止日期升序排序

2.如果它的deadline那一天没有被其他作业占用,那么就直接在那一天做就可以,否则,就向前找,找到有一天是没有被占用的,就在那一天做,找不到的话,就只能被扣分。

       贪心的妙用在第二天尤为重要,因为这个是一段时间,所以每次都从时间倒着看,如果最后一天没用被占用,就用最后一天,否则依次往前,这样是为了下一个作业有充足的时间。

错误原因

        要扣除最少的分数,肯定应该以分数为主进行排序。而我错误的以时间进行排序。

代码

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct work
{
	int time,score;
}works[1200];
bool cmp(work a,work b)
{
	if(a.score!=b.score)
	    return a.score>b.score;
	else
	    return a.time<b.time;
}//先按所扣分数的高低降序排序,分数一样的时候就按截止日期升序排序 
int num[1200];
int main()
{
	int t,n;
	int i,j,k;
	int sum,tim;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		sum=0;
		for(i=0;i<n;i++)
		    scanf("%d",&works[i].time);
		for(i=0;i<n;i++)
		{
		    scanf("%d",&works[i].score);
		    sum+=works[i].score;
		}
		sort(works,works+n,cmp);
		memset(num,0,sizeof(num)); 
		for(i=0;i<n;i++)
		{
			tim=works[i].time;
			for(j=tim;j>0;j--)
			{
				if(num[j]==0)
				{
					num[j]=1;//时间被占用之后就标记一下 
					break;
				}
			}
	//2.如果它的deadline那一天没有被其他作业占用,那么就直接
	//在那一天做就可以,否则,就向前找,找到有一天是没有被占用的,
	//就在那一天做,找不到的话,就只能被扣分。
			if(j!=0)
			    sum-=works[i].score;
		}
		printf("%d\n",sum);
	}
	return 0;
} 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值