1572: [Usaco2009 Open]工作安排Job[贪心]
Description
Farmer John 有太多的工作要做啊!!!!!!!!为了让农场高效运转,他必须靠他的工作赚钱,每项工作花一个单位时间。 他的工作日从0时刻开始,有1000000000个单位时间(!)。在任一时刻,他都可以选择编号1~N的N(1 <= N <= 100000)项工作中的任意一项工作来完成。 因为他在每个单位时间里只能做一个工作,而每项工作又有一个截止日期,所以他很难有时间完成所有N个工作,虽然还是有可能。 对于第i个工作,有一个截止时间D_i(1 <= D_i <= 1000000000),如果他可以完成这个工作,那么他可以获利P_i( 1<=P_i<=1000000000 ). 在给定的工作利润和截止时间下,FJ能够获得的利润最大为多少呢?答案可能会超过32位整型。
Input
第1行:一个整数N. 第2~N+1行:第i+1行有两个用空格分开的整数:D_i和P_i.
Output
输出一行,里面有一个整数,表示最大获利值。
Sample Input
2 10
1 5
1 7
Sample Output
HINT
第1个单位时间完成第3个工作(1,7),然后在第2个单位时间完成第1个工作(2,10)以达到最大利润
题解:
前几天做到和这题一模一样的题,在此mark
当时没想出来最优的贪心策略,自己就乱搞了个暴力模拟的样子,然后骗到了50貌似
顺便提一下自己的傻逼模拟方法好了
先根据利润排序,如果利润的最大截至时间下并没有完成工作,就让最大截至时间做,否则就往上找到一个没有工作的时间
感觉说的有点奇怪?
那还是看代码好了
排序部分略(虽然只有一行,- - 我知道我很懒)
for(int i=1;i<=n;i++)
if(!ans[f[i].t]) ans[f[i].t]=f[i].x;//最大截至时间,没做
else
head=f[i].t;
while(ans[f[head])
head--;//往前找,看看有没有哪个时间是没有做过的
ans[head]=f[i].x;
然后把ans全部加起来即可
思路和正解有点相像之处,都是用了堆的思想,但是以上暴力只是用了思想而已,把堆运用起来就是正解了!
正解听起来貌似比我的傻逼暴力容易懂一点?
你需要根据截至时间来排序;
我们可以知道,做完堆中当前所有元素的时间应该为 dui.size() 这个可以理解吧
我们扫一遍当前的序列
如果当前找到的这个利润a所截至的时间比 dui.size()小,那么,我们把a和堆里最小的利润相比较,如果比最小的大,那么我们当然是选择利润大的做,即,我们把a压入堆中,把小的那个扔掉
如果当前找到的这个利润a所截至的时间比 dui.size()大,那么,我们就暂且把它压入堆中,因为你不造后面的天里的利润
最后同样把堆里的利润全部加起来即可,记得开long long
主要的代码:
for (int i = 0; i < n; ++i)
if (a[i].t > heap.size())
heap.push(a[i].x);
else if (a[i].x > heap.top())
{
heap.pop();
heap.push(a[i].p);
}
ps:我们在这里维护的是大根堆,即单调递增
priority_queue<int , vector <int> , greater<int> > dui;
然后
1572: [Usaco2009 Open]工作安排Job[贪心]的更多相关文章
- BZOJ 1572: [Usaco2009 Open]工作安排Job( 贪心 )
贪心... 按截止时间排序 , 然后从小到大考虑 . 假设当前考虑第 i 个任务 , 若目前已选工作数 < D_i , 那就选 i ; 否则 若已选工作中利润最小的比 P_i 小 , 那就去除它 ...
- BZOJ 1572: [Usaco2009 Open]工作安排Job 贪心 + 堆 + 反悔
Description Farmer John想修理牧场栅栏的某些小段.为此,他需要N(1<=N<=20,000)块特定长度的木板,第i块木板的长度为Li(1<=Li<=50, ...
- 【BZOJ 1572】 1572: [Usaco2009 Open]工作安排Job(贪心+优先队列)
1572: [Usaco2009 Open]工作安排Job Description Farmer John 有太多的工作要做啊!!!!!!!!为了让农场高效运转,他必须靠他的工作赚钱,每项工作花一个单 ...
- 1572: [Usaco2009 Open]工作安排Job
1572: [Usaco2009 Open]工作安排Job Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 814 Solved: 365[Submit ...
- [bzoj1572][Usaco2009 Open]工作安排Job_贪心_堆
工作安排 Job bzoj-1572 Usaco-2009 Open 题目大意:题目链接. 注释:略. 想法: 我们将任务按照截止时间排序,枚举任务的同时顺便记录出已经做了多少任务(当前时间). 对于 ...
- BZOJ 1572 [Usaco2009 Open]工作安排Job:贪心 + 优先队列【先放再更新】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1572 题意: 有n个工作,每个工作有一个截止日期dead[i]和收益pay[i]. 完成一 ...
- bzoj 1572: [Usaco2009 Open]工作安排Job【贪心+堆】
先按照时间顺序加,价值塞进小根堆里,碰到不合法情况就从堆里减去 #include<iostream> #include<cstdio> #include<queue> ...
- 【BZOJ】1572: [Usaco2009 Open]工作安排Job
[题意]给定n项工作的截止时间和价值,每项工作需要1单位时间完成,求最大价值.n<=10^5. [算法]贪心+堆 [题解] 如果是访问到x时将d[x]前的点从价值最大的能加就加是错误的贪心,因为 ...
- 【bzoj1572】[Usaco2009 Open]工作安排Job 贪心+堆
题目描述 Farmer John 有太多的工作要做啊!!!!!!!!为了让农场高效运转,他必须靠他的工作赚钱,每项工作花一个单位时间. 他的工作日从0时刻开始,有1000000000个单位时间(!). ...
随机推荐
- JavaScript之对象序列化详解
一.什么是对象序列化? 对象序列化是指将对象的状态转换为字符串(来自我这菜鸟的理解,好像有些书上也是这么说的,浅显易懂!): 序列化(Serialization)是将对象的状态信息转换为可以存储或传输 ...
- Git 命令速查表
Git 命令速查表 1.常用的Git命令 命令 简要说明 git add 添加至暂存区 git add-interactive 交互式添加 git apply 应用补丁 git am 应用邮件格式补丁 ...
- 重写ArcGIS的TiledMapServiceLayer呼叫世界地图图块
require(["esri/layers/TiledMapServiceLayer"], function () { dojo.declare("com.Str ...
- 导入三方包,出现ClassNotFoundException
在项目中须要引用settings模块里面的某个活动.在eclipse中导入settins.jar包之后,使用例如以下方式启动: Intent intent = new Intent(); intent ...
- 6天通吃树结构—— 第五天 Trie树
原文:6天通吃树结构-- 第五天 Trie树 很有段时间没写此系列了,今天我们来说Trie树,Trie树的名字有很多,比如字典树,前缀树等等. 一:概念 下面我们有and,as,at,cn,com这些 ...
- measureChildren作品
无论是在改写View依然是ViewGroup什么时候.特别ViewGrop什么时候,通常是不可避免的重写onMeasure方法,我们一定会调用setMeasuredDimension()将測量好的宽高 ...
- php禁用一些重要功能
passthru() 功能叙述性说明:我们同意将运行外部程序和回音输出.分类似至 exec(). 临界水平:高 exec() 功能叙述性说明:同意运行外部程序(例如 UNIX Shell 要么 CMD ...
- 【地图API】为何您的坐标不准?如何纠偏?
原文:[地图API]为何您的坐标不准?如何纠偏? 摘要:各种坐标体系之间如何转换?到底有哪些坐标体系?什么是火星坐标?为什么我的坐标,在地图上显示会有偏移?本文详细解答以上问题.最后给出坐标拾取工具. ...
- 【百度地图API】北京周边7日游——图标按路线轨迹行动
原文:[百度地图API]北京周边7日游--图标按路线轨迹行动 任务描述: 春节就要来啦~酸奶小妹的妈妈要从遥远的重庆,来到北京过春节呢!酸奶小妹忙着给妈妈计划,北京周边的旅游线路.计划好路线后,就开始 ...
- linux内核的冒险md来源释义# 14raid5非条块读
linux内核的冒险md来源释义# 14raid5非条块读 转载请注明出处:http://blog.csdn.net/liumangxiong 假设是非条块内读.那么就至少涉及到两个条块的读,这就须要 ...