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

按右端点排序后依次加入,并且每一次看是否能被修筑,如果能就修;否则查找原来修过的,如果原来修过的最大的建筑花的时间比当前所要花的时间大,那么我们就决策:不修原来那个,改为修当前的(因为起点一样,所花时间少,两者的右边界都是满足的,用了后者时间能减少,使得给可能存在的后边的解提供机会)。可以证明这样最优。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <iostream>
#include <algorithm>
#include <queue>
#include <set>
#include <map>
using namespace std;
typedef long long ll;
#define pii pair<int, int>
#define mkpii make_pair<int, int>
#define pdi pair<double, int>
#define mkpdi make_pair<double, int>
#define pli pair<ll, int>
#define mkpli make_pair<ll, int>
#define rep(i, n) for(int i=0; i<(n); ++i)
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
#define for2(i,a,n) for(int i=(a);i<(n);++i)
#define for3(i,a,n) for(int i=(a);i>=(n);--i)
#define for4(i,a,n) for(int i=(a);i>(n);--i)
#define CC(i,a) memset(i,a,sizeof(i))
#define read(a) a=getint()
#define print(a) printf("%d", a)
#define dbg(x) cout << (#x) << " = " << (x) << endl
#define error(x) (!(x)?puts("error"):0)
#define printarr2(a, b, c) for1(_, 1, b) { for1(__, 1, c) cout << a[_][__]; cout << endl; }
#define printarr1(a, b) for1(_, 1, b) cout << a[_] << '\t'; cout << endl
inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }
inline const int max(const int &a, const int &b) { return a>b?a:b; }
inline const int min(const int &a, const int &b) { return a<b?a:b; } priority_queue<int> q;
pii a[150005];
int n; int main() {
read(n);
for1(i, 1, n) read(a[i].second), read(a[i].first);
sort(a+1, a+1+n);
int now=0, ans=0;
for1(i, 1, n) {
if(a[i].second+now<=a[i].first) ++ans, now+=a[i].second, q.push(a[i].second);
else {
if(q.empty()) continue;
int x=q.top();
if(x<=a[i].second) continue;
now-=x-a[i].second;
q.pop();
q.push(a[i].second);
}
}
printf("%d\n", ans);
return 0;
}

  


Description

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

Input

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

Output

输出一个整数S,表示最多可以抢修S个建筑。 数据范围: N<150000,T1

Sample Input

4
100 200
200 1300
1000 1250
2000 3200

Sample Output

3

HINT

 

Source

最新文章

  1. JDBC介绍
  2. 递推 hdu 1330
  3. BLE教程 - 官方tutorial翻译
  4. 图层的transform属性
  5. Android窗口为弹出框样式
  6. php数据库操作类
  7. LVS+Keepalived实现高可用负载均衡(转)
  8. 2012 T-SQL 新特性 and O2O项目
  9. [Rails] 从 Request 到 Response(1)
  10. C语言:min和max头文件
  11. openwrt下 samba设置
  12. supervisord 备注
  13. 【Objective-C】内存管理
  14. QImage与cv::Mat转换;
  15. Kafka实战-Kafka到Storm
  16. js--事件冒泡-捕获
  17. PostgreSQL Q&amp;A: Building an Enterprise-Grade PostgreSQL Setup Using Open Source Tools
  18. LOJ#3052. 「十二省联考 2019」春节十二响(启发式合并)
  19. PAT甲题题解-1035. Password (20)-水
  20. Android studio导入eclipse项目遇到的错误解决方案

热门文章

  1. sublime text 全局搜索快捷键
  2. MSSQL查找前一天,前一月,前一年的数据,对比当前时间记录查找超过一年,一月,一天的数据
  3. UESTC-1307-windy数
  4. 虚拟机VMware下CentOS6.5安装教程图文详解(VMnet8)
  5. PLSQL Split分割字符串
  6. 腾讯QQ的发展与未来
  7. Linux命令-目录处理命令:mv
  8. List多个字段标识过滤
  9. Python 爬虫 去掉网页注释,去掉网页注释
  10. JEECG与帆软报表集成