Doing Homework again(hdu1789,贪心)

73 篇文章 0 订阅
10 篇文章 0 订阅

http://acm.hdu.edu.cn/showproblem.php?pid=1789

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=29256#problem/A

A - Doing Homework again

Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

Submit

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

解析:

题意:老师布置n种作业,每种作业都有相应的上交期限,如果迟完成的话要扣掉相应的分数。规定每天只能做一种作业,问如何安排是的扣分最少

思路:

贪心法;

既然目的是使得扣分最少,那么就以分数作为优先考虑条件

1.排序,将分数高的排在前面,分数相同再按时间低高的优先

2.枚举每种作业,让它在靠近期限内完成,并把当天标记,如果在期限时间都被占用了话,则说明不能完成改作业。

 

336 KB 31 ms C++ 828 B

*/

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
#include <iostream>
using namespace std;
const int maxn=1000+10;
int used[maxn];
struct node
{
int d;
int s;
}p[maxn];
bool cmp(node a,node b)
{
return a.s>b.s||(a.s==b.s&&a.d>b.d);//按照分数优先
}
int max(int a,int b)
{
return a>b ? a:b;
}
int main()
{int T,i,j,n,ans;
 scanf("%d",&T);
 while(T--)
 {
 	scanf("%d",&n);
 	for(i=1;i<=n;i++)
 	{scanf("%d",&p[i].d);
 	}
 	for(i=1;i<=n;i++)
 	{
 	 scanf("%d",&p[i].s);
 	}
 	sort(p+1,p+1+n,cmp);
 	memset(used,0,sizeof(used));
 	//for(i=1;i<=n;i++)
 	//printf("d==%d,s=%d\n",p[i].d,p[i].s);
 	ans=0;
 	for(i=1;i<=n;i++)
 	{
 	 for(j=p[i].d;j>0;j--)//判断可用的空间是否被占用
 	 {
 	 if(used[j]==0)//选择最近日期
 	 {used[j]=1;
 	 break;
 	 }
 	 }
 	 if(j==0)//如果都被占用则不能完成
 	 ans+=p[i].s;
 	}
 	printf("%d\n",ans);
 }
 system("pause");
return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值