【贪心+优先队列】51Nod 1053 最大M子段和 V2
2017-10-30 15:26
417 查看
题面在这里
其实很简单……
首先有一个贪心想法就是把所有的正数都取来
但是这样子段数可能会超过m
那么有以下两种方法减少子段数:
删去一个正的子段
取一个负的子段,并将相邻两个正子段合并
然后把这两种操作都扔到优先队列里,每次取就好了
示例程序:
其实很简单……
首先有一个贪心想法就是把所有的正数都取来
但是这样子段数可能会超过m
那么有以下两种方法减少子段数:
删去一个正的子段
取一个负的子段,并将相邻两个正子段合并
然后把这两种操作都扔到优先队列里,每次取就好了
示例程序:
#include<cstdio> #include<algorithm> #include<queue> #define _abs(x) ((x)>0?(x):-(x)) using namespace std; typedef long long ll; inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++; } inline int red(){ int res=0,f=1;char ch=nc(); while (ch<'0'||'9'<ch) {if (ch=='-') f=-f;ch=nc();} while ('0'<=ch&&ch<='9') res=(res<<3)+(res<<1)+ch-48,ch=nc(); return res*f; } const int maxn=50005; int n,N,m,a[maxn],lst[maxn],nxt[maxn],tot; ll ans,b[maxn]; inline void del(int i){ lst[nxt[i]]=lst[i]; nxt[lst[i]]=nxt[i]; } struct data{ ll x;int id; data () {} data(ll _x,int _id):x(_x),id(_id) {} bool operator<(const data&b)const{ return x>b.x; } }; priority_queue<data> Q; int main(){ n=red(),m=red(); for (int i=1;i<=n;i++){ a[i]=red(); if (i==1||(a[i]>0)^(a[i-1]>0)) N++; b +=a[i]; } for (int i=1;i<=N;i++){ lst[i]=i-1;nxt[i]=i+1; Q.push(data(_abs(b[i]),i)); if (b[i]>0) ans+=b[i],tot++; } lst[0]=0;nxt[0]=1;lst[N+1]=N;nxt[N+1]=N+1; while (tot>m){ data d=Q.top();Q.pop(); if (lst[nxt[d.id]]!=d.id||nxt[lst[d.id]]!=d.id) continue; if (b[d.id]<=0&&(lst[d.id]<1||nxt[d.id]>N)) continue; ans-=d.x;tot--;b[d.id]+=b[lst[d.id]]+b[nxt[d.id]];del(lst[d.id]);del(nxt[d.id]); Q.push(data(_abs(b[d.id]),d.id)); } printf("%lld",ans); return 0; }
相关文章推荐
- 51Nod-1053-最大M子段和 V2
- 51Nod 1052/1053/1115 最大M子段和V1/V2/V3
- 51nod 1053 最大M子段和 V2[贪心][链表][堆]
- 51nod 1053 最大M子段和 V2
- 51nod 最大M子段和 V1,V2,V3 dp 贪心 heap(bzoj2288)
- 51nod 1053 最大M子段和 V2 (链表 对经典dp进行优化)
- 51nod 最大M子段和V2【贪心】【链表】【堆】
- 51nod 1254 最大子段和 V2 ——单调栈
- 【贪心+优先队列】1428 活动安排问题【51nod】【难度:2级算法题】
- 51Nod 1163 最高的奖励(贪心+优先队列 & 并差集)
- 51nod 1117 聪明的木匠【贪心+优先队列】
- HDU 6000 Wash【优先队列优化贪心】【最大值+最小值】
- 51nod 1053 最大M子段和 V2
- 51Nod - 1475 优先队列 + 贪心
- 【2015-2016 ACM-ICPC, NEERC, Southern Subregional Contest F】【贪心+ STL-优先队列】 Gourmet and Banquet 最大活动时间
- 51nod 1672【贪心+优先队列】
- 【51nod】1302 矩形面积交【优先队列贪心】
- 贪心+优先队列-51nod-1428 活动安排问题
- 51nod 1254最大子段和V2
- 51nod消灭兔子 贪心+优先队列