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

Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)

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

本题作为一道比较基础的贪心题,在很久之前就做过了,具体请看博文http://www.cnblogs.com/dilthey/p/6804173.html

那为什么今天还要再做一遍呢,因为昨天参加校赛看到一道贪心题,和这道题目比较类似;

但是那道题目因为deadline非常大,不能像这题一样,开个标记数组,往前遍历;

所以就有了另一种解法(另一种贪心思路)。

解法:

考虑每天我们能做一样作业,所以我们用一个for循环+优先队列来模拟每天做作业的情况;

首先,根据贪心思想,我们越早做那些deadline比较早的作业比较好,因此我们先把所有作业按照deadline从小到大排序(复杂度O( n * log n ));

然后,我们构建一个存储作业的优先队列Heap(按照作业的扣分从小到大排列),用它的size()表示当前的日期;

对排序后的作业进行遍历,会遇到如下一些情况:

①作业的deadline大于Heap.size(),表示我们可以在今天("Heap.size()+1"这一天)做这项作业;

 因此,push入Heap即可。

②作业的deadline小于等于Heap.size(),表示这项作业hw[i]我们只能在 "1~Heap.size()" 这些天里完成,那么又会遇到两种情况:

 先取出Heap.top(),由于我们按照作业的扣分从小到大维护这个优先队列,所以堆顶部的是:已完成的、扣分最少的那项作业;

  1)hw[i].reduced_score > Heap.top().reduced_score,也就是说,我们还是做hw[i]更划算(扣的分更少),所以我们将用hw[i]替换掉Heap.top();

    这时,显然Heap.top()属于是“被抛弃的作业”,不可能再被完成了,所以ans += Heap.top().reduced_score

  2)hw[i].reduced_score <= Heap.top().reduced_score,显然,这时我们要放弃的作业就是hw[i]了;

    同样的,ans += hw[i].reduced_score;

最后,输出ans即可。

AC代码:

#include<bits/stdc++.h>
using namespace std;
struct Hw{
int dl,rs;//截止日期,会扣的分数
bool operator < (const Hw& oth)const{return oth.rs<rs;}
}hw[];
bool cmp(Hw a,Hw b){return a.dl<b.dl;}
int n;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=;i<n;i++) scanf("%d",&hw[i].dl);
for(int i=;i<n;i++) scanf("%d",&hw[i].rs);
sort(hw,hw+n,cmp);
//for(int i=0;i<n;i++) printf("%d %d\n",hw[i].dl,hw[i].rs); priority_queue<Hw> heap;
int ans=;
for(int i=;i<n;i++)
{
if(hw[i].dl>heap.size()) heap.push(hw[i]);
else
{
//printf("now heap.top = %d,%d\n",heap.top().dl,heap.top().rs);
if(hw[i].rs>heap.top().rs)
{
ans+=heap.top().rs;
heap.pop();
heap.push(hw[i]);
}
else ans+=hw[i].rs;
}
} printf("%d\n",ans);
}
}

(PS.其实实际上,heap不需要把整个作业都存进去,单单维护int类型的reduced_score也是完全可以的,不过为了说起来清晰明了一些,就维护了Hw);

最后,

比对一下之前用的基础贪心做法和这次的优化后的做法,可以明显地看到时间空间复杂度的降低;

HDU 1789 - Doing Homework again - [贪心+优先队列]的更多相关文章

  1. hdu 1789 Doing HomeWork Again (贪心算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1789 /*Doing Homework again Time Limit: 1000/1000 MS ...

  2. HDU 1789 Doing Homework again(贪心)

    Doing Homework again 这只是一道简单的贪心,但想不到的话,真的好难,我就想不到,最后还是看的题解 [题目链接]Doing Homework again [题目类型]贪心 & ...

  3. hdu 1789 Doing Homework again (Greedy)

    Problem - 1789 继续贪心.经典贪心算法,如果数据比较大就要用线段树来维护了. 思路很简单,只要按照代价由大到小排序,然后靠后插入即可.RE了一次,是没想到deadline可以很大.如果d ...

  4. HDU 1789 Doing Homework again(非常经典的贪心)

    Doing Homework again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  5. 题解报告:hdu 1789 Doing Homework again(贪心)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1789 Problem Description Ignatius has just come back ...

  6. HDU 1789 Doing Homework again (贪心)

    Doing Homework again http://acm.hdu.edu.cn/showproblem.php?pid=1789 Problem Description Ignatius has ...

  7. HDU 1789 Doing Homework again(贪心)

    在我上一篇说到的,就是这个,贪心的做法,对比一下就能发现,另一个的扣分会累加而且最后一定是把所有的作业都做了,而这个扣分是一次性的,所以应该是舍弃扣分小的,所以结构体排序后,往前选择一个损失最小的方案 ...

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

    题目中因为天数和分数是对应的,所以我们使用一个结构体来存分数和截止如期. 一开始做这道题的时候,很自然的就想到对天数排序,然后天数一样的分数从大到小排序,最后WA了之后才发现没有做到"舍小取 ...

  9. HDU 1789 Doing Homework again【贪心】

    题意:给出n个作业的截止时间,和该作业没有完成会被扣掉的分数.问最少会被扣掉多少分. 第一次做这一题是好久之前,当时不会(不会处理两个关键字关系@_@)---现在还是不会---看了题解---原来是这样 ...

随机推荐

  1. iOS js与objective-c的交互(转)

    在写 JavaScript 的时候,可以使用一个叫做 window 的对象,像是我们想要从现在的网页跳到另外一个网页的时候,就会去修改 window.location.href 的位置:在我们的 Ob ...

  2. Go之对象拷贝

    这里interface{}就相当于c#,java中的object, boy := util.Boy{util.Person{"Eric", 19, "boy"} ...

  3. vue-resource和vue-axios的简单使用方法

    两者其实差别不大,都是基于es6的Promise对象实现的方法 vue-resource: main.js => import Vue from 'vue'; import VueResourc ...

  4. Ubuntu图形界面和字符界面转换、指定默认启动界面

    1.按ALT+CTRL+F1.F2.F3.F4.F5.F6.F7可来回切换7个界面(Linux实体机)      其中ALT+CTRL+F7可切换到图形界面(Linux实体机)        如果是V ...

  5. [Shell] Shell 中的算术

    Shell 脚本变量默认是作为字符串处理,而不是数字,这使得在 Shell 脚本做数学运算显得较为复杂.在保持脚本编程规范和更好的算术支持方便,Perl 和 Python 会是更好的选择.但是你仍然可 ...

  6. 如何构建日均千万PV Web站点(二) 之~缓存为王~

    随着网站业务的不断发展,用户的规模越来越大:介于中国无比蹩脚复杂的网路环境:南电信:北联通:中间竟然只用一条链路进行互联通信!有研究表明,网站访问延迟和用户流失率正相关,网站访问速度越慢,用户越容易失 ...

  7. IOS网络篇1之截取本地URL请求(NSURLProtocol)

    本文转载至 http://blog.csdn.net/u014011807/article/details/39894247 NSURLProtocol 是iOS中非常重要的一个部分,我们经常会在以下 ...

  8. codeforces水题100道 第十三题 Codeforces Round #166 (Div. 2) A. Beautiful Year (brute force)

    题目链接:http://www.codeforces.com/problemset/problem/271/A题意:给你一个四位数,求比这个数大的最小的满足四个位的数字不同的四位数.C++代码: #i ...

  9. (转载)Recyclerview | Intent与Bundle在传值上的区别 | 设置布局背景为白色的三种方法

    用Recyclerview实现列表分组.下拉刷新以及上拉加载更多  http://www.jianshu.com/p/be62ce21ea57 Intent与Bundle在传值上的区别http://b ...

  10. IOS设计模式第三篇之外观设计模式

    外观设计模式: 这个外观设计模式提供了一个单独的接口给复杂的子系统.而不是暴露用户的一组类和API,你仅仅暴露一个简单的同一的API. 下面的图片解释这个概念: API的用户根本不知道后面系统的复杂性 ...