描述


http://www.lydsy.com/JudgeOnline/problem.php?id=1029

\(n\)个任务需要完成,给出每个任务所需时间\(t_1\)与deadline\(t_2\),问最多能完成多少个任务.

分析


对于两个任务\(a,b\),设\(b.t_2>a.t_2\).

1.先完成\(b\),再完成\(a\),那么要求\(T+a.t_1+b.t_1<=a.t_2<b.t_2\).

2.先完成\(a\),再完成\(b\),那么要求\(T+a.t_1<=a.t_2,T+a.t_1+b.t_1<=b.t_2\).

显然第二种方案条件更宽松,更可能实现,所以我们先完成deadline小的.

先以\(t_2\)为关键字排序.对于第\(i\)个任务:

1.如果时间允许,那么完成它,并入队,ans++.

2.如果时间不允许,如果队中\(t_1\)最大的比当前任务的\(t_1\)还要大,那么取出队头,把当前任务加进去(答案不变,但是让后面的任务的时间更充裕).

 #include <bits/stdc++.h>
using namespace std; const int maxn=+;
int n;
struct node{
int t1,t2;
node(int t1=,int t2=):t1(t1),t2(t2){}
bool operator < (const node &a) const { return t2<a.t2; }
}a[maxn];
inline void solve(){
priority_queue <int> q;
int now=,ans=;
for(int i=;i<=n;i++){
if(now+a[i].t1<=a[i].t2) q.push(a[i].t1),now+=a[i].t1,ans++;
else if(a[i].t1<=q.top()&&now-q.top()+a[i].t1<=a[i].t2){
now+=a[i].t1-q.top();
q.pop(); q.push(a[i].t1);
}
}
printf("%d\n",ans);
}
inline void init(){
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d%d",&a[i].t1,&a[i].t2);
sort(a+,a++n);
}
int main(){
init();
solve();
return ;
}

1029: [JSOI2007]建筑抢修

Time Limit: 4 Sec  Memory Limit: 162 MB
Submit: 3565  Solved: 1637
[Submit][Status][Discuss]

Description

  小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的
入侵者。但是T部落的基地里已经有N个建筑设施受到了严重的损伤,如果不尽快修复的话,这些建筑设施将会完全
毁坏。现在的情况是:T部落基地里只有一个修理工人,虽然他能瞬间到达任何一个建筑,但是修复每个建筑都需
要一定的时间。同时,修理工人修理完一个建筑才能修理下一个建筑,不能同时修理多个建筑。如果某个建筑在一
段时间之内没有完全修理完毕,这个建筑就报废了。你的任务是帮小刚合理的制订一个修理顺序,以抢修尽可能多
的建筑。

Input

  第一行是一个整数N接下来N行每行两个整数T1,T2描述一个建筑:修理这个建筑需要T1秒,如果在T2秒之内还
没有修理完成,这个建筑就报废了。

Output

  输出一个整数S,表示最多可以抢修S个建筑.N < 150,000;  T1 < T2 < maxlongint

Sample Input

4
100 200
200 1300
1000 1250
2000 3200

Sample Output

3

HINT

Source

BZOJ_1029_[JSOI2007]_建筑抢修_(贪心+优先队列)的更多相关文章

  1. BZOJ1029: [JSOI2007]建筑抢修[模拟 贪心 优先队列]

    1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec  Memory Limit: 162 MBSubmit: 3785  Solved: 1747[Submit][Statu ...

  2. [BZOJ1029] [JSOI2007]建筑抢修(贪心 + 优先队列)

    传送门 把数据存在结构体中,至于怎么贪心? 肯定会有些想法,正确错误先不必说,先来试一试. 1.按照 t2 为第一关键字从小到大排,按照 t1 为第二关键字从小到大排 这个显然错,比如后面有个数的 t ...

  3. BZOJ_1029_ [JSOI2007]建筑抢修_贪心+堆

    BZOJ_1029_ [JSOI2007]建筑抢修_贪心+堆 Description 小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者.但是 ...

  4. 【BZOJ1029】建筑抢修(贪心)

    [BZOJ1029]建筑抢修(贪心) 题面 BZOJ 洛谷 题解 感觉自己已经不会贪心了. 很明显的一个想法是按照终止时间排序,然后能选则选. 但是这样子可能会因为前面选择了一个修理时间很长的,导致现 ...

  5. BZOJ 1029: [JSOI2007]建筑抢修 堆+贪心

    1029: [JSOI2007]建筑抢修 Description 小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者.但是T部落的基地里已经有 ...

  6. BZOJ 1029 [JSOI2007] 建筑抢修(贪心)

    1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec  Memory Limit: 162 MBSubmit: 2285  Solved: 1004[Submit][Statu ...

  7. 【BZOJ】1029: [JSOI2007]建筑抢修(贪心)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1029 按右端点排序后依次加入,并且每一次看是否能被修筑,如果能就修:否则查找原来修过的,如果原来修过 ...

  8. bzoj1029: [JSOI2007]建筑抢修(堆+贪心)

    1029: [JSOI2007]建筑抢修 题目:传送门 题解: 一道以前就做过的水题(找个水题签个到嘛...) 很明显就是一道贪心题,这里我们用一个堆来维护 具体看代码吧,很容易YY所以不讲 代码: ...

  9. 【bzoj1029】【JSOI2007】建筑抢修

    1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec  Memory Limit: 162 MBSubmit: 6417  Solved: 2883[Submit][Statu ...

随机推荐

  1. android 使某个控件获取焦点

    比如让某个edittext获取焦点,可以调用edittext.requestfocuse()的方法

  2. [问题]C# 结构体对齐:如何将变长byte数组对齐

    [StructLayout(LayoutKind.Sequential,Pack=1)] struct Report_Read_Parameter { byte Confirmation; byte ...

  3. 【CodeForces】【148D】Bag of mice

    概率DP kuangbin总结中的第9题 啊……题目给的数据只有白鼠和黑鼠的数量,所以我们只能在这个上面做(gao)文(D)章(P)了…… 明显可以用两种老鼠的数量来作为状态= = 我的WA做法: 令 ...

  4. WinForm 中ComboBox 绑定总结

    1.DataTable绑定 用DataTable直接绑定,只需要设置DataSource.DisplayMember.ValueMember三个属性即可. this.cmbConsume.DataSo ...

  5. MSVC CRT运行库启动代码分析

    原文链接:http://www.programlife.net/msvc-crt-startup.html 在程序进入main/WinMain函数之前,需要先进行C运行库的初始化操作,通过在Visua ...

  6. jsp中文件下载的实现

    jsp中实现文件下载的最简单的方式是在网页上做超级链接,如:<a href="music/abc.mp3">点击下载</a>.但是这样服务器上的目录资源会直 ...

  7. hdu 2177 取(2堆)石子游戏 博弈论

    由于要输出方案,变得复杂了.数据不是很大,首先打表,所有whthoff 的奇异局势. 然后直接判断是否为必胜局面. 如果必胜,首先判断能否直接同时相减得到.这里不需要遍历或者二分查找.由于两者同时减去 ...

  8. hdu 4282 A very hard mathematic problem

    由于k的范围是0-2^31,而且x,y,z都是正整数,由题易知道2<=z<31,1<=x<y;所以直接枚举就好了!!! #include<iostream> #in ...

  9. windows cmd控制台打开和关闭SqlServer 以及 显示发生系统错误5 拒绝访问的解决方案

    打开:net start mssqlserver 关闭:net stop mssqlserver 在dos下输入 net start mssqlserver 显示发生系统错误5 拒绝访问 解决办法,以 ...

  10. Oracle 9 - redo和undo

    1.redo redo 有在线redo日志和归档redo日志, 从Oracle 10g开始还新增加了flashback技术. 每个Oracle数据库至少有2个在线重做日志组,循环写. 只有INSERT ...