博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
1029: [JSOI2007]建筑抢修
阅读量:4983 次
发布时间:2019-06-12

本文共 1314 字,大约阅读时间需要 4 分钟。

1029: [JSOI2007]建筑抢修

 

分析:

  维护一个大根堆,记录所有修过的点中的修理时间。

  首先按结束时间排序,依次取出结束时间较小的,如果当前的与以前的不冲突,那么直接加入,ans++。

  否则,取出堆中的修理花费时间最大的y,比较前的x与y,如果x修理时间更小,那么可以不修y,修理x。而y的修理时间比x大,所以x是一定能够修理的。

代码:

1 #include
2 using namespace std; 3 typedef long long LL; 4 5 inline int read() { 6 int x=0,f=1;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1; 7 for (;isdigit(ch);ch=getchar())x=x*10+ch-'0';return x*f; 8 } 9 10 pair
a[150010];11 priority_queue
q;12 13 int main() {14 int n = read();15 for (int i=1; i<=n; ++i) //second为修理时间,first为结束时间 16 a[i].second = read(),a[i].first = read();17 sort(a+1,a+n+1);18 int ans = 0,now = 0;19 for (int i=1; i<=n; ++i) { // 按结束时间依次取出 20 if (now + a[i].second <= a[i].first) { // 时间不冲突 21 ++ans;22 now += a[i].second;23 q.push(a[i].second);24 }25 else { // 时间冲突,同样是修理一个,修理用时少的,让后面有更多的选择 26 if (q.empty()) continue; // --!q.empry() 27 int x = q.top();28 if (x <= a[i].second) continue;29 now -= x;now += a[i].second;30 q.pop();31 q.push(a[i].second);32 }33 }34 cout << ans;35 return 0;36 }

 

转载于:https://www.cnblogs.com/mjtcn/p/9273897.html

你可能感兴趣的文章
服务级后门自己做——创建服务 分类: VC++ ...
查看>>
push本地代码到github发生错误的解决办法
查看>>
设置遮罩层
查看>>
Catalyst 3850 升级-1
查看>>
static
查看>>
python模块之time模块
查看>>
bzoj2882: 工艺
查看>>
Shell中的${},##和%%的使用
查看>>
创建一个随机对象列表
查看>>
省市联动 js
查看>>
常用HTTP状态码
查看>>
WebAPI GET和POST请求的几种方式
查看>>
re 模块 常用正则表达式符号 最常用的匹配语法
查看>>
第三小节之Java API
查看>>
python3之迭代器&生成器
查看>>
《此生未完成》读后感
查看>>
Nexus搭建Maven私服
查看>>
访问者模式
查看>>
CentOS 7安装最新版本Git
查看>>
DTW的原理及matlab实现
查看>>