BZOJ 1150 [CTSC2007]数据备份Backup(贪心+优先队列)
【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=1150
【题目大意】
给出n个数,请你挑出k对(每个数不可重复选取),使得他们差的绝对值之和最小(k小于等于n/2)
【题解】
因为数列给出有序,省去排序步骤,我们发现最优答案一定是选择k对相邻的数,
因此我们将相邻的数两两之间求差,得到差分数列,
现在问题转化为在这个新的数列中,选取k个不相邻的数,使得和最小。
我们发现在选取一个数之后,只对左右两边的数有影响,
所以,每当我们选取一个数,就把这个数以及它两边的数删除,
然后再在它的位置上新加一个数,值为被选取的数两边数的和减去被选去的数
那么我们如果选了这个数,就相当于原来的数我们就不选了,类似于最大流的退流思想。
这样做之后,我们每次只要选择最小的数,累加到答案即可。
对于被删除了却仍然在优先队列中的数,我们用一个标记来维护它。
【代码】
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cstring>
using namespace std;
const int N=200010;
unsigned long long ans;
bool del[N];
struct data{
int id,key,l,r;
bool operator <(const data&rhs)const{
return key>rhs.key;
}
}w[N];
priority_queue<data> Q;
int a[N],n,k;
int main(){
while(~scanf("%d%d",&n,&k)){
ans=0;
memset(del,0,sizeof(del));
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<n;i++){
w[i].id=i;
w[i].key=a[i+1]-a[i];
w[i].l=i-1;
w[i].r=i+1;
Q.push(w[i]);
}n--;
w[n].r=w[0].l=w[0].r=0;
w[0].key=0x3f3f3f3f;
while(k--){
for(;;){
data t=Q.top();
Q.pop();
int id=t.id,l=w[id].l,r=w[id].r;
if(del[id])continue;
del[id]=del[l]=del[r]=1;
ans+=w[id].key;
w[++n].id=n;
w[n].key=w[l].key+w[r].key-w[id].key;
w[n].l=w[l].l; w[n].r=w[r].r;
w[w[l].l].r=n; w[w[r].r].l=n;
Q.push(w[n]);
break;
}
}printf("%lld\n",ans);
}return 0;
}
BZOJ 1150 [CTSC2007]数据备份Backup(贪心+优先队列)的更多相关文章
- 【链表】bzoj 1150: [CTSC2007]数据备份Backup
1150: [CTSC2007]数据备份Backup Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1136 Solved: 458[Submit] ...
- [BZOJ 1150] [CTSC2007] 数据备份Backup 【贪心 + 链表】
题目链接:BZOJ - 1150 题目分析 可以看出,我们选的 k 条边一定是相邻两点之间的线段.我们可以将每条边看成一个点,那么我们就是要在 n-1 个点中选出互不相邻的 k 个,使它们的和最小. ...
- bzoj 1150: [CTSC2007]数据备份Backup
Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家 ...
- BZOJ 1150 CTSC2007 数据备份Backup 堆+馋
标题效果:给定一个长度n−1n-1的序列,要求选出kk个不相邻的数使得和最小 费用流显然能跑.并且显然过不去- - 考虑用堆模拟费用流 一个错误的贪心是每次取最小.这样显然过不去例子 我们把[每次取最 ...
- bzoj 1150: [CTSC2007]数据备份Backup【链表+堆】
参考:http://blog.csdn.net/Regina8023/article/details/44158947 神奇的做法.题意相当于若干个数取不相邻的k个使最小.先把数组差分,len表示这段 ...
- 【BZOJ 1150】 1150: [CTSC2007]数据备份Backup (贪心+优先队列+双向链表)
1150: [CTSC2007]数据备份Backup Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设 ...
- 1150: [CTSC2007]数据备份Backup
1150: [CTSC2007]数据备份Backup https://lydsy.com/JudgeOnline/problem.php?id=1150 分析: 堆+贪心. 每次选最小的并一定是最优的 ...
- BZOJ1150 [CTSC2007] 数据备份Backup 贪心_堆_神题
Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家 ...
- BZOJ1150 [CTSC2007]数据备份Backup 贪心 堆
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1150 题意概括 数轴上面有一堆数字. 取出两个数字的代价是他们的距离. 现在要取出k对数,(一个数 ...
随机推荐
- 在AndroidStudio中导入开源库 或者jar
方法一: 先点击Androidstudio中的Project Structure,如图 图1 到如下界面 图2 然后点击+号 图3 选择Library dependency 图4 输入你要的jar包, ...
- 大话Spring Cloud
研究了一段时间Spring Boot了准备向Spring Cloud进发,公司架构和项目也全面拥抱了Spring Cloud.在使用了一段时间后发现Spring Cloud从技术架构上降低了对大型系统 ...
- 关于解决coursera视频缓冲问题
关于解决coursera视频缓冲问题 之前使用coursera,不FQ的话,视频根本加载不出来,于是每次都FQ过去看的视频.后来发现可以直接修改hosts就可以了. 以下方法来源知乎的回答(侵删). ...
- spin lock的理解
为什么在spin lock保护的代码里面不允许有休眠的操作呢? 因为spin lock不是空实现的前提下(内核没关抢占,或者是SMP打开),spin lock中是关抢占的,如果一个进程A拿到锁,内核抢 ...
- ThinkPHP5 正则验证中有“|”时提示“规则错误”的解决方案
正则规则中有“|”时,会引起解析错误: 'regex:\d{3,4}[\s,-]?\d{7,8}|1[3,4,5,8]\d[\s,-]?\d{4}[\s,-]?\d{4}' 使用数组语法可以解决: [ ...
- xtrabackup 安装、备份和恢复
xtrabackup 版本对应: 2.4 专针对 5.7 开发的,兼容 5.6, 5.5 2.3 针对 5.6 开发的,兼容5.5 2.2 针对5.5 开发的 安装包下载: wget https:// ...
- VPS性能测试方法小结(8)
1.为了能够得到更为准确和详细的有关VPS主机性能测试数据,我们应该多角度.全方位地运行多种VPS性能测试工具来进行检测,同时也要记得排除因本地网络环境而造成的数据结果的错误. 2.VPS主机性能跑分 ...
- Android UI 设计:pixel dip dpi sp density
1. px (pixels)像素 – 是像素,就是屏幕上实际的像素点单位. dip或dp (device independent pixels)设备独立像素,与设备屏幕有关. sp (scaled p ...
- PCA和SVD
一.PCA(Principal Component Analysis) 主成分分析,数据从原来的坐标系转换到新的坐标系,只保留新坐标系中的前面几个坐标轴,即对数据进行了降维处理 1.算法描述 (1)第 ...
- Mysql 数据库学习笔记05 触发器
一.触发器 * 是由时间来出发某个操作,这些事件可以包括 insert.update.delete.等语句.当执行这些操作时,就会触发对应的操作. * 创建一个执行语句的触发器: create tri ...