uva 1153 顾客是上帝(贪心)
uva 1153 顾客是上帝(贪心)
有n个工作,已知每个工作需要的时间q[i]和截止时间d[i](必须在此前完成),最多能完成多少个工作?工作只能串行完成,第一项任务开始的时间不早于时刻0.
这道题算比较难的贪心了。解法是维护一个关于所有选择的时间的大根堆。将所有工作按照截止时间排序(将二维问题转化为一维问题),然后依次考虑每一个工作。如果当前的总时间t,加上当前工作的时间t1,小于等于当前工作的截止时间d1,那么直接把当前工作加入大根堆中。如果t+t1>d1,说明如果做这个工作,就超时了,所以要考虑该不该做这个工作的问题。如果t1<大根堆顶的时间,说明如果把前面的一个工作消除掉,再做这个工作,时间能更短,我们当然选择把这个工作压到堆里去。如果t1>大根堆顶,说明这个工作是不能替换的。
插一句:贪心真是一种玄学的东西。。很多时候贪心要跟着感觉走,因为根本证明不出来~~~~~
#include <queue>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=8e5+5;
int T, n;
priority_queue<int> q;
struct Work{
int q, d;
}w[maxn];
bool cmp1(Work &x, Work &y){
return x.d<y.d; }
int main(){
scanf("%d", &T);
while (T--){
while (!q.empty()) q.pop();
scanf("%d", &n);
for (int i=0; i<n; ++i)
scanf("%d%d", &w[i].q, &w[i].d);
sort(w, w+n, cmp1);
int tott=0, ans=0, maxelmt;
for (int i=0; i<n; ++i){
if (tott+w[i].q<=w[i].d){ //如果放的下就放
tott+=w[i].q; ++ans;
q.push(w[i].q);
} else {
maxelmt=q.top();
if (maxelmt>w[i].q){ //如果换了更优就换
q.pop(); q.push(w[i].q);
tott=tott-maxelmt+w[i].q; }
}
}
printf("%d\n", ans);
if (T) puts("");
}
return 0;
}
uva 1153 顾客是上帝(贪心)的更多相关文章
- UVA - 1153 Keep the Customer Satisfied(贪心)
UVA - 1153 Keep the Customer Satisfied Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: ...
- UVA 1153 Keep the Customer Satisfied 顾客是上帝(贪心)
因为每增加一个订单,时间是会增加的,所以先按截止时间d排序, 这样的话无论是删除一个订单,或者增加订单,都不会影响已经选好的订单. 然后维护一个已经选好的订单的大根堆(优先队列),如果当前无法选择的话 ...
- UVA - 1153 Keep the Customer Satisfied(顾客是上帝)(贪心)
题意:有n(n<=800000)个工作,已知每个工作需要的时间qi和截止时间di(必须在此之前完成),最多能完成多少个工作?工作只能串行完成.第一项任务开始的时间不早于时刻0. 分析:按截止时间 ...
- UVa 1153 Keep the Customer Satisfied (贪心+优先队列)
题意:给定 n 个工作,已知每个工作要用的时间 q 和 截止时间 d,问你最多完成多少个工作,每次最多能运行一个工作. 析:这个题是贪心,应该能看出来,关键是贪心策略是什么,这样想,先按截止时间排序, ...
- 紫书 习题8-12 UVa 1153(贪心)
本来以为这道题是考不相交区间, 结果还专门复习了一遍前面写的, 然后发现这道题的区间是不是 固定的, 是在一个范围内"滑动的", 只要右端点不超过截止时间就ok. 然后我就先考虑有 ...
- 【uva 1153】Keep the Customer Satisfied(算法效率--贪心+优先队列)
题意:有N个工作,已知每个工作需要的时间和截止时间.要求所有工作穿行完成,第一项任务开始的时间不早于时刻0.问最多能完成多少个工作.(N≤800000) 解法:贪心.可以模型化题目为:已知N个任务的长 ...
- UVa 1153 Keep the Customer Satisfied 【贪心 优先队列】
题意:给出n个工作,已知每个工作需要的时间last,以及截止时间end,(必须在截止时间之前完成)问最多能够完成多少个工作 首先预处理,将这n件任务按照截止时间从小到大排序 然后用一个cur记录当前做 ...
- 【NOIP合并果子】uva 10954 add all【贪心】——yhx
Yup!! The problem name reects your task; just add a set of numbers. But you may feel yourselvesconde ...
- uva 11134 fabled rooks (贪心)——yhx
We would like to place n rooks, 1 n 5000, on a n nboard subject to the following restrictions• The i ...
随机推荐
- 分享知识-快乐自己:redis集群搭建
Redis介绍: 1.开源的NoSql数据库 2.C语言编写 3.基于内存运行,并且支持持久化 4.Key value存储 5.是主流的Nosql数据库之一 Redis优点: 1.内存使用方面,表现优 ...
- Hibernate学习---第十二节:Hibernate之锁机制&乐观锁实现
1.悲观锁 它指的是对数据被外界修改保持保守态度,因些,在整个数据处理过程中,将数据牌锁定状态.悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层的锁机制才能保证数据访问的排他性,否则,即使在本 ...
- SQL的CASE表达式用法
case 表达式从SQL-92标准开始引入,因此是不依赖于具体的数据库技术,可提高SQL代码的可移植性. case表达式注意事项: 1. 统一各个分支返回数据类型,并保证各个when字句的排他性,因为 ...
- 用JavaScript实现表单按回车自动提交
JavaScript实现表单form1按回车自动提交代码如下: <script type="text/javascript"> function submitMe() ...
- sql split函数
--DROP FUNCTION F_SQLSERVER_SPLIT GO CREATE FUNCTION F_SQLSERVER_SPLIT(@Long_str varchar(8000),@spli ...
- bzoj 1441: Min 裴蜀定理
题目: 给出\(n\)个数\((A_1, ... ,A_n)\)现求一组整数序列\((X_1, ... X_n)\)使得\(S=A_1*X_1+ ...+ A_n*X_n > 0\),且\(S\ ...
- photon server (1)
Photon是一套使用广泛的socket server引擎,服务端底层C++编写,客户端C#编写,跨多平台,收费,效率可观的一款引擎.实用上前有九城游戏(原魔兽世界代理),现在笔者发现多款腾讯旗下3D ...
- 第一个 IronPython 的 ASP.NET 程序
今天试验了在 Visual Studio 中集成使用 IronPython,记录如下. 首先,下载一个 IronPython 1.0 的 binary,解压后,将目录路径 配置到环境变量 Path 中 ...
- URL、SRC、HREF知识整理
今天理一下URL.SRC.HREF定义以及使用区别. URL(Uniform Resource Locator) 统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上 ...
- python中如何定义main方法
我们有时写的python模块需要自己测试, 简单方法就是定义main函数, 然后测试自己的模块接口. def main(): test_yourCode() if __name__ == & ...