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

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

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1029

这道题好像是一道比较经典的贪心,最主要的思路是用堆来提供反悔,修正决策的途径。

我们首先按每个建筑的最晚修复时间排序。然后扫过去,能修就修,并且将修过建筑所用的时间加入到堆里面。

如果遇到了不能修的情况,我们看一下堆顶元素花费的时间与当前所需要的时间的大小关系,如果堆顶元素更大,那么我们反悔,不修之前那个建筑,把时间省下来修当前的建筑,然后把所需时间加入堆中。这样就完成了一次决策的修正。

1 #include
2 #include
3 #include
4 #include
5 using namespace std; 6 typedef long long ll; 7 int inline readint(){ 8 int Num;char ch; 9 while((ch=getchar())<'0'||ch>'9');Num=ch-'0';10 while((ch=getchar())>='0'&&ch<='9') Num=Num*10+ch-'0';11 return Num;12 }13 int N;14 struct Building{15 int t1,t2;16 bool operator < (const Building &_)const{17 return t2<_.t2;18 }19 }A[150010];20 priority_queue
q;21 int main(){22 N=readint();23 for(int i=1;i<=N;i++){24 A[i].t1=readint();25 A[i].t2=readint();26 }27 sort(A+1,A+1+N);28 ll ti=0;29 int ans=0;30 for(int i=1;i<=N;i++){31 if(ti+A[i].t1<=A[i].t2){32 ti+=A[i].t1;33 q.push(A[i].t1);34 ans++;35 }36 else{37 int tmp=q.top();38 if(tmp>A[i].t1){39 q.pop();40 ti-=tmp-A[i].t1;41 q.push(A[i].t1);42 }43 }44 }45 printf("%d\n",ans);46 return 0;47 }

 

转载于:https://www.cnblogs.com/halfrot/p/7608530.html

你可能感兴趣的文章
《架构之美》阅读笔记05
查看>>
《大道至简》读后感——论沟通的重要性
查看>>
JDBC基础篇(MYSQL)——使用statement执行DQL语句(select)
查看>>
java中Hashtable和HashMap的区别(转)
查看>>
关闭数据库
查看>>
webStrom智能提示忽略首字母大小写问题
查看>>
层叠加的五条叠加法则(一)
查看>>
设计模式六大原则(5):迪米特法则
查看>>
对Feature的操作插入添加删除
查看>>
javascript String
查看>>
ecshop 系统信息在哪个页面
查看>>
【转】码云source tree 提交超过100m 为什么大文件推不上去
查看>>
Oracle数据库的增、删、改、查
查看>>
MySql执行分析
查看>>
git使用中的问题
查看>>
yaml文件 .yml
查看>>
linux字符集修改
查看>>
phpcms 添加自定义表单 留言
查看>>
mysql 优化
查看>>
读书笔记 ~ Nmap渗透测试指南
查看>>