bzoj 1029: [JSOI2007]建筑抢修【贪心+堆】
2018-08-02 18:38
411 查看
第一想法是按照结束时间贪心,但是这样有反例
所以先按照t贪心,能选则选,把选的楼的持续时间放进大根堆里,当当前的楼不能选的时候如果当前的持续时间比大根堆里最大的要小,就用这个替换最大,这样总数不变但是时间缩短了
#include<iostream> #include<cstdio> #include<queue> #include<algorithm> using namespace std; const int N=150005; int n,ans; struct qwe { long long l,t; }a ; bool cmp(const qwe &a,const qwe &b) { return a.t<b.t; } long long read() { long long r=0,f=1; char p=getchar(); while(p>'9'||p<'0') { if(p=='-') f=-1; p=getchar(); } while(p>='0'&&p<='9') { r=r*10+p-48; p=getchar(); } return r*f; } int main() { n=read(); for(int i=1;i<=n;i++) a[i].l=read(),a[i].t=read(); sort(a+1,a+1+n,cmp); long long tm=0; priority_queue<long long>q; for(int i=1;i<=n;i++) { if(tm+a[i].l<=a[i].t) { tm+=a[i].l; q.push(a[i].l); ans++; } else if(!q.empty()&&a[i].l<q.top()) { tm=tm-q.top()+a[i].l; q.pop(); q.push(a[i].l); } } printf("%d\n",ans); return 0; }
相关文章推荐
- BZOJ.1029.[JSOI2007]建筑抢修(贪心)
- 【贪心+堆】BZOJ1029(JSOI2007)[建筑抢修]题解
- 【BZOJ1029】【JSOI2007】【建筑抢修】【贪心+堆】
- BZOJ 1029: [JSOI2007]建筑抢修(贪心)
- BZOJ 1029: [JSOI2007]建筑抢修【优先队列+贪心策略】
- BZOJ_1029_ [JSOI2007]建筑抢修_贪心+堆
- BZOJ1029 [JSOI2007]建筑抢修(贪心+堆)
- BZOJ 1029: [JSOI2007]建筑抢修 堆+贪心
- [BZOJ1029] [JSOI2007]建筑抢修(贪心 + 优先队列)
- [BZOJ 1029] JSOI 2007 建筑抢修 · 贪心+堆
- bzoj 1029: [JSOI2007]建筑抢修(贪心+优先队列)
- [BZOJ1029][JSOI2007]建筑抢修(贪心+堆)
- BZOJ 1029 JSOI2007 建筑抢修 贪心+堆
- BZOJ 1029 [JSOI2007]建筑抢修 贪心
- 【堆,贪心】BZOJ1029 [JSOI2007]建筑抢修
- BZOJ 1029 [JSOI2007] 建筑抢修(贪心)
- BZOJ 1029 [JSOI2007]建筑抢修 (贪心 + 优先队列)
- [BZOJ1029][JSOI2007][贪心][堆]建筑抢修
- BZOJ 1029([JSOI2007]建筑抢修-贪心+heap+class中cmp的写法)
- BZOJ_1029_[JSOI2007]_建筑抢修_(贪心+优先队列)