Doing Homework again(hdu1789,贪心)

来源:互联网 发布:麒麟970和高通835知乎 编辑:程序博客网 时间:2024/05/04 15:42

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;}