ACwing 147 数据备份 贪心 set
LINK:数据备份
以前做过这种贪心 不过没有好好的证明 这次来严格的证明一下。
不难发现 最后的答案 选择的所有两对公司必然相邻。
所以排序后 把数组变成ai-ai-1. 这样问他的模型就是 n-1个数从中选出k个数 且任意两个数不能相邻 求和的最小值。
k==1时显然是全局最小值。
k==2的时候 有两种方法:全局最小值 和全局最小值不相邻的 最小数字。还有一种 把全局最小值扔了 选他们两边的数字。
此时 选出全局最小值之后把左右两边元素给去掉 因为这两个决策假了。
加入一个新决策 :两边元素之和-中间的元素。
然后可以发现 此时决策集合完全覆盖了我们上述的分析。
考虑拓展到k比较大的情况。
我们不断维护决策集合的完整性。而且对于每一个局面都是一样的。所以从递归来看这是正确的。
换个角度:从一个局面最优转到另一个局面 可以发现 此时如果我们选择了上次新决策那么符合我们前面的结论2.
如果选择了其他元素符合前面的结论1.
对于一个新局面来说其最优也是来自两个结论。
综上 做出的所有决策都是 结论1和结论2的一种 这对于所有的局面都是最优的选择 所以是正确的。
const int MAXN=100010;
int n,k;
ll ans;
int l[MAXN],r[MAXN];
ll w[MAXN];
ll a[MAXN];
multiset<pii>s;
multiset<pii>:: iterator it,itt,itt1;
int main()
{
//freopen("1.in","r",stdin);
get(n);get(k);
rep(1,n,i)get(a[i]);
sort(a+1,a+1+n);
rep(1,n-1,i)w[i]=a[i+1]-a[i],s.insert(mk(w[i],i)),l[i]=i-1,r[i]=i+1;
w[0]=inf;w[n]=inf;s.insert(mk(w[0],0));s.insert(mk(w[n],n));
while(k--)
{
it=s.begin();
ans+=(*it).F;
int x=(*it).S;
int L=l[x];
int R=r[x];
s.erase(it);
itt=s.find(mk(w[L],L));
s.erase(itt);
itt1=s.find(mk(w[R],R));
s.erase(itt1);
w[x]=w[R]+w[L]-w[x];
l[x]=l[L];r[x]=r[R];
r[l[L]]=x;l[r[R]]=x;
s.insert(mk(w[x],x));
}
putl(ans);
return 0;
}
ACwing 147 数据备份 贪心 set的更多相关文章
- [APIO / CTSC2007]数据备份 --- 贪心
[APIO / CTSC 2007]数据备份 题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份. 然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同的办公 ...
- 【apio2007】【ctsc2007】 数据备份 贪心+链表+堆
题目大意:有n个点,k条链,每个点离原点有一定的距离.要你用k条链连接2k个点,使得k条链的长度最短. 首先每次肯定是链相邻的2个点,所以我们先把相邻2个点的差值求出来,得到有n-1个数的数列. 然后 ...
- 洛谷$P3620\ [APIO/CTSC 2007]$数据备份 贪心
正解:贪心 解题报告: 传送门$QwQ$ $umm$感觉这种问题还蛮经典的,,,就选了某个就不能选另一个这样儿,就可以用堆模拟反悔操作 举个$eg$,如果提出了$a_i$,那就$a_{i-1}$和$a ...
- [luogu3620][APIO/CTSC 2007]数据备份【贪心+堆+链表】
题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏 ...
- [APIO/CTSC 2007]数据备份(贪心+堆)
你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏的乐趣. ...
- 【BZOJ 1150】 1150: [CTSC2007]数据备份Backup (贪心+优先队列+双向链表)
1150: [CTSC2007]数据备份Backup Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设 ...
- BZOJ_1150_[CTSC2007]数据备份Backup_堆+贪心
BZOJ_1150_[CTSC2007]数据备份Backup_堆+贪心 Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏 ...
- BZOJ1150 [CTSC2007] 数据备份Backup 贪心_堆_神题
Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家 ...
- P3620 [APIO/CTSC 2007]数据备份[优先队列+贪心]
题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏 ...
随机推荐
- HTML5(三)SVG vs. Canvas
HTML5 内联 SVG 什么是SVG? SVG 指可伸缩矢量图形 (Scalable Vector Graphics) SVG 用于定义用于网络的基于矢量的图形 SVG 使用 XML 格式定义图形 ...
- 石子合并——区间dp
石子合并(3种变形) <1> 题目: 有N堆石子排成一排(n<=100),现要将石子有次序地合并成一堆,规定每次只能选相邻的两堆合并成一堆,并将新的一堆的石子数,记为改次合并的得分, ...
- 深入浅出了解CDN
背景: 本文公众号来源:漫话编程 虎牙直播2000W+人在线观看,直播间还不卡,据了解,2018年1月,阿里云为虎牙提供了边缘节点服务(ENS).基于阿里云ENS,可以轻松地将业务模块放到边缘运行,在 ...
- gitlab-ci部署实现持续集成(centos7)
一.gitlab安装 1. 环境准备 // selinux和 firewall 关闭 $ setenforce 0 $ sed -i "/^SELINUX/s/enforcing/disab ...
- CRM【第二篇】: stark组件
介绍: stark组件,是一个帮助开发者快速实现数据库表的增删改查+的组件.目标: 10s 中完成一张表的增删改查. 前戏: django项目启动时,自定义执行某个py文件. django启动时,且在 ...
- Django框架08 /聚合查询、分组、F/Q查询、原生sql相关
Django框架08 /聚合查询.分组.F/Q查询.原生sql相关 目录 Django框架08 /聚合查询.分组.F/Q查询.原生sql相关 1. 聚合查询 2. 分组 3. F查询和Q查询 4. o ...
- Python并发编程06 /阻塞、异步调用/同步调用、异步回调函数、线程queue、事件event、协程
Python并发编程06 /阻塞.异步调用/同步调用.异步回调函数.线程queue.事件event.协程 目录 Python并发编程06 /阻塞.异步调用/同步调用.异步回调函数.线程queue.事件 ...
- Unity-JobSystom
什么是Job System? 一个job system通过创建jobs而不是线程来管理多线程的代码.Job是一个小的工作单元,不等同线程.管理运行在多个核心上的一组工人线程(worker thread ...
- oracle数据库备份还原命令
oracle数据库备份命令exp 用户名/密码@orcl file=d:\xxxxxx.dmp owner=用户名 oracle数据库还原命令sqlplus conn / as sysdba drop ...
- linux $* 和$@例子
参见ibm网站示例: https://www.ibm.com/developerworks/cn/linux/l-bash-parameters.html 示例: [ian@pinguino ~]$ ...