BZOJ1150(CTSC2007)[数据备份Backup]--贪心+链表+堆
来源:互联网 发布:it培训评价网 编辑:程序博客网 时间:2024/05/21 22:44
【链接】
bzoj1150
【解题报告】
对于最优解肯定是相邻两点建边最优。所以我们只需要选最小的前
对于上述的贪心,有如下情况:
从x===x==x===x选两段。
如果直接选最小的肯定会选中间这段(x===x**==**x===x)。
但是实际上只能选两边(x**===x==x===**x)。
经过考虑,我们可以发现如果不选从堆里挑出来前
所以我们只需要再用链表维护一下,就可以了。
#include<cstdio>#include<cstring>#include<queue>#include<algorithm>using namespace std;const int maxn=100005;int n,m,ans,dst[maxn],L[maxn],R[maxn];struct Data{ int s,x; Data (int p,int i) {s=p; x=i;} bool operator < (const Data &a) const{ return s>a.s; }};priority_queue<Data> hep;inline char nc(){ static char buf[100000],*l,*r; if (l==r) r=(l=buf)+fread(buf,1,100000,stdin); if (l==r) return EOF; return *l++;}inline int Read(){ int res=0,f=1; char ch=nc(),cc=ch; while (ch<'0'||ch>'9') cc=ch,ch=nc(); if (cc=='-') f=-1; while (ch>='0'&&ch<='9') res=res*10+ch-48,ch=nc(); return res*f;}int main(){ freopen("1150.in","r",stdin); freopen("1150.out","w",stdout); n=Read(); m=Read(); ans=0; while (!hep.empty()) hep.pop(); for (int i=1,x,lst=0; i<=n; i++) x=Read(),dst[i]=x-lst,lst=x; for (int i=2; i<=n; i++) hep.push((Data){dst[i],i}),L[i]=i-1,R[i]=i+1; L[2]=R[n]=0; for (int i=1; i<=m; i++) { Data now=hep.top(); while (now.s!=dst[now.x]) hep.pop(),now=hep.top(); int l=L[now.x],r=R[now.x]; hep.pop(); ans+=now.s; if (!l) {if (R[r]) L[R[r]]=0; dst[r]=-1; continue;} if (!r) {if (L[l]) R[L[l]]=0; dst[l]=-1; continue;} dst[now.x]=dst[l]+dst[r]-dst[now.x]; hep.push((Data){dst[now.x],now.x}); L[now.x]=L[l]; R[now.x]=R[r]; if (L[l]) R[L[l]]=now.x; if (R[r]) L[R[r]]=now.x; dst[l]=dst[r]=-1; } printf("%d",ans); return 0;}
阅读全文
0 0
- [贪心+堆] BZOJ1150: [CTSC2007]数据备份Backup
- 【堆+贪心】BZOJ1150 [CTSC2007]数据备份Backup
- [bzoj1150][堆][贪心][CTSC2007]数据备份Backup
- 【贪心+堆+链表】BZOJ1150(CTSC2007)[数据备份Backup]题解
- BZOJ1150(CTSC2007)[数据备份Backup]--贪心+链表+堆
- bzoj1150: [CTSC2007]数据备份Backup 贪心
- [BZOJ1150][CTSC2007]数据备份Backup
- bzoj1150: [CTSC2007]数据备份Backup
- 【BZOJ1150】[CTSC2007]数据备份Backup
- BZOJ1150: [CTSC2007]数据备份Backup
- bzoj1150 [CTSC2007]数据备份Backup
- bzoj1150: [CTSC2007]数据备份Backup
- 【bzoj1150】[CTSC2007]数据备份Backup
- bzoj1150 [CTSC2007]数据备份Backup
- 【BZOJ 1150】 [CTSC2007]数据备份Backup|链表|堆|贪心
- 【CTSC2007】bzoj1150 数据备份
- BZOJ 1150 CTSC2007 数据备份Backup 堆+贪心
- bzoj 1150: [CTSC2007]数据备份Backup 贪心&堆
- matlab中使用小波变换进行图像去噪
- mysql5.7官网直译锁操作优化--表锁的使用建议
- 假程序员启示录:房价
- springmvc 登陆后跳转到登陆前的界面
- 遗传算法求解TSP问题
- BZOJ1150(CTSC2007)[数据备份Backup]--贪心+链表+堆
- MySQL zip包使用安装、修改密码讲解
- 61. Rotate List
- POJ 1125(dijkstra)
- Go sha256使用实例介绍
- vi命令总结
- Kotlin新语言使用RxJava+Retrofit请求网络数据+lambda表达式+RecyclerView展示+Glide展示图片
- java需要注意的陷阱和良好的习惯
- 成为“高维空间”的人