[BZOJ1029]JSOI2007 建筑抢修|贪心|堆
2015-04-17 09:59
330 查看
显然是贪心嘛,就是线段覆盖的强化版。。先按deadline升序排序,将每个建筑依次加入。设sum是当前用掉的时间,如果直接将i加进来是可以的也就是sum+time[i]<=deadline[i],那就直接加,否则查询前面加进来的点中时间最大的j,如果time[i]<time[j],就把j删去加入i。最大时间用一个堆维护即可。
#include<iostream> #include<cstdio> #include<memory.h> #include<algorithm> #define maxn 150005 using namespace std; struct building{ int len,t; } a[maxn]; bool cmp(building a,building b){return a.t==b.t?a.len<b.len:a.t<b.t;} int n,i,sum=0,nd=0,ans=0,heap[maxn*4]; void ins(int k) { heap[++nd]=k; int i=nd; while (i>1&&heap[i]>heap[i/2]) swap(heap[i],heap[i/2]),i/=2; } void del() { heap[1]=heap[nd--]; int i=1; while (i<nd&&(heap[i*2]>heap[i]||heap[i*2+1]>heap[i])) if (!heap[i*2+1]||heap[i*2]>heap[i*2+1]) swap(heap[i],heap[i*2]),i*=2; else swap(heap[i],heap[i*2+1]),i=2*i+1; } int main() { freopen("1029.in","r",stdin); scanf("%d",&n); for (i=1;i<=n;i++) scanf("%d%d",&a[i].len,&a[i].t); sort(a+1,a+1+n,cmp);memset(heap,0,sizeof(heap)); for (i=1;i<=n;i++) if (sum+a[i].len<=a[i].t) ins(a[i].len),sum+=a[i].len,ans++; else if (a[i].len<heap[1]) sum-=heap[1]-a[i].len,del(),ins(a[i].len); cout<<ans; }
相关文章推荐
- 【BZOJ1029】【JSOI2007】【建筑抢修】【贪心+堆】
- [JSOI2007]建筑抢修 BZOJ1029 BSOJ2228 CODEVS2913 贪心+大根堆
- 【BZOJ】1029 [JSOI2007]建筑抢修 贪心+堆
- BZOJ1029: [JSOI2007]建筑抢修[模拟 贪心 优先队列]
- 【bzoj1029】[JSOI2007]建筑抢修 贪心+堆
- bzoj 1029: [JSOI2007]建筑抢修(贪心+优先队列)
- BZOJ 1029 JSOI2007 建筑抢修 贪心+堆
- BZOJ.1029.[JSOI2007]建筑抢修(贪心)
- BZOJ 1029: [JSOI2007]建筑抢修【优先队列+贪心策略】
- 【贪心+堆】BZOJ1029(JSOI2007)[建筑抢修]题解
- BZOJ_1029_ [JSOI2007]建筑抢修_贪心+堆
- BZOJ 1029: [JSOI2007]建筑抢修(贪心)
- _bzoj1029 [JSOI2007]建筑抢修【贪心 堆】
- 【BZOJ】1029: [JSOI2007]建筑抢修(贪心)
- [BZOJ1029] [JSOI2007]建筑抢修(贪心 + 优先队列)
- BZOJ_1029_[JSOI2007]_建筑抢修_(贪心+优先队列)
- BZOJ 1029: [JSOI2007]建筑抢修 堆,贪心,排序
- BZOJ 1029: [JSOI2007]建筑抢修 贪心
- [BZOJ 1029] [JSOI2007] 建筑抢修 【贪心】
- [BZOJ 1029] JSOI 2007 建筑抢修 · 贪心+堆