【堆+贪心】BZOJ1150 [CTSC2007]数据备份Backup
来源:互联网 发布:手机点菜软件免费版 编辑:程序博客网 时间:2024/06/11 15:52
题面在这里
先把整个数组差分一下,问题就转化成了:
从n个元素中选择各不相邻的k个,使得其加和最小
用堆来维护。
每次中堆中取出权值最小的一个元素
然后将其与相邻的两个元素
将新元素放入堆中
如此k次即可。
可以用双向链表维护元素的相邻关系。
此方法的正确性在于:
当从堆顶取得一个新元素时,就相当于撤销了
这样取的次数仍然等于取的元素个数。
注意边界情况。
示例程序:
#include<cstdio>#include<queue>using namespace std;typedef long long LL;const int maxn=100005,INF=0x3f3f3f3f;int n,k,a[maxn],L[maxn],R[maxn];bool vis[maxn];LL ans;struct data{ int id,x; data () {} data (int _id,int _x):id(_id),x(_x) {} bool operator<(const data&b)const{ return x>b.x; }};priority_queue<data> Q;int main(){ int lst;scanf("%d%d%d",&n,&k,&lst); for (int i=1;i<n;i++){ int x;scanf("%d",&x);L[i]=i-1;R[i]=i+1; a[i]=x-lst;lst=x;Q.push(data(i,a[i])); } n--;a[0]=INF;a[n+1]=INF; R[0]=1;L[n+1]=n;L[0]=0;R[n+1]=n+1; for (int i=1;i<=k;i++){ while (Q.top().id!=R[L[Q.top().id]]||Q.top().id!=L[R[Q.top().id]]) Q.pop(); data x=Q.top();Q.pop(); ans+=x.x; a[x.id]=a[L[x.id]]+a[R[x.id]]-x.x; Q.push(data(x.id,a[x.id])); R[L[x.id]=L[L[x.id]]]=x.id; L[R[x.id]=R[R[x.id]]]=x.id; } printf("%lld",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
- 【CTSC2007】bzoj1150 数据备份
- BZOJ 1150 CTSC2007 数据备份Backup 堆+贪心
- 【BZOJ 1150】 [CTSC2007]数据备份Backup|链表|堆|贪心
- bzoj 1150: [CTSC2007]数据备份Backup 贪心&堆
- IDEA中设置main方法自动补全
- Java语言基础学习笔记(八)
- 数组强制转换成结构体指针
- 【洛谷】2344 奶牛抗议 DP+树状数组
- 在阿里云上创建svn
- 【堆+贪心】BZOJ1150 [CTSC2007]数据备份Backup
- App测试方法总结
- android6.0权限封装及全局捕获异常
- Kafka文件存储机制那些事
- spring data jpa
- Web应用
- Linux中的GPIO口使用方法
- bzoj 1997: [Hnoi2010]Planar 2-SAT+平面图
- “双鸭山大学”的来源