hdu 1789 Doing HomeWork Again (贪心算法)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1789

/*Doing Homework again

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

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

Author
lcy

Source
2007省赛集训队练习赛(10)_以此感谢DOOMIII

*/
//贪心算法
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1000 + 100;
struct Node{
    int d, s;
};
Node node[maxn];
int Mark[maxn];
bool cmp(Node a, Node b){
    return a.s > b.s;
}
int main()
{
    int t, n;
    while(~scanf("%d", &t)){
        while(t--){
            scanf("%d", &n);
            memset(Mark, 0, sizeof(Mark));
            for(int i = 1; i <= n; i++) scanf("%d", &node[i].d);
            for(int i = 1; i <= n; i++) scanf("%d", &node[i].s);
            sort(node+1, node+n+1, cmp);
            int i, j, cnt = 0;
            for(i = 1; i <= n; i++){
                for(j = node[i].d; j >= 1; j--){
                    if(!Mark[j]){
                        Mark[j] = 1;
                        break;
                    }
                }
                if(j == 0) cnt += node[i].s;
            }
            printf("%d\n", cnt);
        }
    }
    return 0;
}
时间: 2024-12-12 01:43:55

hdu 1789 Doing HomeWork Again (贪心算法)的相关文章

HDU 1789 - Doing Homework again - [贪心+优先队列]

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1789 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem DescriptionIgnatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Eve

HDU 1789 Doing Homework again(贪心)

Doing Homework again 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 deadlin

HDU 1009.FatMouse&#39; Trade【贪心算法】【8月16】

FatMouse' Trade Problem Description FatMouse prepared M pounds of cat food, ready to trade with the cats guarding the warehouse containing his favorite food, JavaBean. The warehouse has N rooms. The i-th room contains J[i] pounds of JavaBeans and req

HDU 1009 FatMouse&#39; Trade (贪心算法)

题意:就是老鼠要用猫粮换粮食,第i个房间一些东西,要用东西去换,可以不全换.问给定的猫粮最多能换多少粮食. 析:贪心算法.我们先算出来每个房间物品的平均价格是多少,肯定越低越好,并且如果能全换就全换,如果不能, 肯定是最后一次了,就把剩下全部换了,看看能换多少.求和. 代码如下: #include <iostream> #include <cstdio> #include <algorithm> #include <queue> #include <v

HDU - 1789 Doing Homework again(贪心) ~~~学了一波sort对结构体排序

题目中因为天数和分数是对应的,所以我们使用一个结构体来存分数和截止如期. 一开始做这道题的时候,很自然的就想到对天数排序,然后天数一样的分数从大到小排序,最后WA了之后才发现没有做到"舍小取大"的贪心.所以改变一下策略,对分数排序,如果分数一样的话,时间从小到大排序(因为我们的目的就是先做分多的作业,所以分数一样的得放到前几天去做). (具体sort排结构体知识见代码里面,其实也可以写两次for来排序): 思路:排好序之后,从小到大遍历,每找到一个分数,去寻找对应的天数到第一天中有没有

贪心/hdu 1789 Doing Homework again

1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 using namespace std; 5 int n,ans; 6 struct node 7 { 8 int score; 9 int ddl; 10 }; 11 node a[1010]; 12 bool day[1010]; 13 bool cmp(node x,node y) 14 { 15 return x.score>y.s

hdu 1789 Doing Homework again(贪心)

题意:N个作业,每个作业有个deadline.每个作业完成耗时一天. 如果某个作业没在deadline前完成,则要扣去一定的分数. 给出N个要扣除的分数score[1]....score[N]. 如何安排使得扣分最少?求最少扣分. 思路: 按扣分多少从大到小排序,然后一个一个放到各自的deadline前的某个位置,哪个位置? 哪个位置有空就放那儿,且必须要都靠后!也就是从后往前放.这样可以保证最优地不占用更靠前的别人的deadline前的空间. 具体看代码,,,, 代码: struct node

HDU 1789 Doing Homework again【贪心】

题意:给出n个作业的截止时间,和该作业没有完成会被扣掉的分数.问最少会被扣掉多少分. 第一次做这一题是好久之前,当时不会(不会处理两个关键字关系@[email protected])---现在还是不会---看了题解---原来是这样的--- 因为要使得扣的分数尽可能少,那就先把扣分多的作业做了,即按照扣分降序排序,再遍历看该份作业能不能完成,不能完成则扣去相应的分数 #include<iostream> #include<cstdio> #include<cstring>

hdu 1257 &amp;&amp; hdu 1789(简单DP或贪心)

第一题;http://acm.hdu.edu.cn/showproblem.php?pid=1257 贪心与dp傻傻分不清楚,把每一个系统的最小值存起来比较 1 #include<cstdio> 2 using namespace std; 3 int a[30001],b[30001]; 4 int main() 5 { 6 int n,i,j; 7 while (~scanf("%d",&n)) 8 { 9 int ans=0; 10 b[0]=-1; 11 f