题解:[APIO/CTSC 2007]数据备份
你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份。然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏的乐趣。
已知办公楼都位于同一条街上。你决定给这些办公楼配对(两个一组)。每一对办公楼可以通过在这两个建筑物之间铺设网络电缆使得它们可以互相备份。
然而,网络电缆的费用很高。当地电信公司仅能为你提供 K 条网络电缆,这意味着你仅能为 K 对办公楼(或总计 2K 个办公楼)安排备份。任一个办公楼都属于唯一的配对组(换句话说,这 2K 个办公楼一定是相异的)。
此外,电信公司需按网络电缆的长度(公里数)收费。因而,你需要选择这 K对办公楼使得电缆的总长度尽可能短。换句话说,你需要选择这 K 对办公楼,使得每一对办公楼之间的距离之和(总距离)尽可能小。
下面给出一个示例,假定你有 5 个客户,其办公楼都在一条街上,如下图所示。这 5 个办公楼分别位于距离大街起点 1km, 3km, 4km, 6km 和 12km 处。电信公司仅为你提供 K=2 条电缆。
其实说白了,这个题目的题意就是说,对于一组数进行差分,找出k个数两两不相邻使选取的数最少
首先有一种很容易想到的nk的算法,就是进行DP,不过在这里需要滚动,因为内存不够,用f[i,j]表示到第i个点的时候选了j个,这个转移比较简单,就不再多说了
下面我们来看正解,这个题目的做法很多,这里讲一下贪心的做法。
首先,直接贪心肯定是不对的,比如4,3,5,10,贪心的结果是13,但是显然结果应该是9,所以这里的贪心就是带反悔的(这种思想有点像网络流,所以有大佬说这个是模拟费用流,但是我不会emmm)。
怎么反悔呢?
每去除来一个点i,我们就要把i和两边的点给删去,和ans+s[i]相反的就是ans+s[i-1]+s[i+1],所以,我们需要的是在删去i之后加上一个值为s[i-1]+s[i+1]-s[i]的点,这样的话,如果取了两边点,两次加起来就是s[i-1]+s[i+1]-s[i]+s[i]=s[i-1]+s[i+1],相当于取了两边的点。
对于这个的维护,可以用堆,可以用平衡树(其实我觉得用平衡树好维护一些,但是懒得慌,就打了优先队列)
AC代码如下:
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
#define re register
#define gc getchar()
#define ll long long
#define il inline
const int N=,lim=(<<);
const ll INF=1e9;
il int read() {
re int x(),f();
re char ch=gc;
while(ch<''||ch>'') {
if(ch=='-') f=-;
ch=gc;
}
while(ch>=''&&ch<='') {
x=(x<<)+(x<<)+(ch^);
ch=gc;
}
return x*f;
}
struct node {
long long x,id;
bool operator < (const node & a) const {
return x>a.x;
}
};
priority_queue <node> q;
int n,k,s[N],la[N],ne[N];
bool vis[N];
int main() {
n=read(),k=read();
for(int i=; i<=n; ++i)
s[i]=read();
for(int i=; i<n; ++i) {
s[i]=s[i+]-s[i];la[i]=i-,ne[i]=i+;
q.push((node){
s[i],i
});
}
s[n]=s[]=INF;
int num=;
long long ans=;
for(re int i=; i<=k; ++i) {
node a;
while(vis[q.top().id]&&!q.empty())
q.pop();
a=q.top(),q.pop();
ans+=a.x;
int l=la[a.id],r=ne[a.id];
s[a.id]=s[l]+s[r]-s[a.id];
ne[la[l]]=ne[l],la[ne[l]]=la[l],la[l]=ne[l]=;
ne[la[r]]=ne[r],la[ne[r]]=la[r],la[r]=ne[r]=;
vis[l]=vis[r]=;
q.push((node) {
s[a.id],a.id
});
}
cout<<ans;
return ;
}
题解:[APIO/CTSC 2007]数据备份的更多相关文章
- 洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心)
洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/132 ...
- P3620 [APIO/CTSC 2007]数据备份
P3620 [APIO/CTSC 2007]数据备份 题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同 ...
- 洛谷 P3620 [APIO/CTSC 2007]数据备份 解题报告
P3620 [APIO/CTSC 2007]数据备份 题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同 ...
- [luogu3620][APIO/CTSC 2007]数据备份【贪心+堆+链表】
题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏 ...
- [APIO/CTSC 2007]数据备份(贪心+堆)
你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏的乐趣. ...
- 洛谷P3620 [APIO/CTSC 2007] 数据备份 [堆,贪心,差分]
题目传送门 题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽 ...
- P3620 [APIO/CTSC 2007]数据备份[优先队列+贪心]
题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏 ...
- 题解 P3620 【[APIO/CTSC 2007]数据备份】
直接贪心(每次选最小)的话显然不对...样例都过不了... 选两个办公楼的时候,显然不能跨越另一个楼,这样不优... 于是 先把原数列处理成n-1个的数(每一个办公楼和上一个的距离),存在a[]中 题 ...
- [APIO/CTSC 2007]数据备份
嘟嘟嘟 这竟然是一道贪心题,然而我在不看题解之前一直以为是dp. 首先最优的配对一定是相邻两个建筑物配对,所以我们求出差分数组,就变成了在n - 1个数中选出不相邻的k个数,使这k个数的和最小. 贪心 ...
随机推荐
- 二、IPC机制
1.Android IPC简介 IPC是Inter-Process Communication的缩写,含义为进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程. ANR:Applicatio ...
- C++ 浅拷贝与深拷贝探究
C++浅拷贝与深拷贝探究 浅拷贝与深拷贝的概念是在类的复制/拷贝构造函数中出现的. 拷贝构造函数使用场景 对象作为参数,以值传递方式传入函数(要调用拷贝构造函数将实参拷贝给函数栈中的形参) 对象作为返 ...
- Redis压缩列表
此篇文章是主要介绍Redis在数据存储方面的其中一种方式,压缩列表.本文会介绍1. 压缩列表(ziplist)的使用场景 2.如何达到节约内存的效果?3.压缩列表的存储格式 4. 连锁更新的问题 5 ...
- 在angular 6中使用 less
在angular 6中使用 less 新项目 ng new [appname] --style less 已有的项目 修改 *.css 文件及引用处后缀名为 less并在 angular.json 文 ...
- 一些常用的meta标签
<!DOCTYPE html> <!-- 使用 HTML5 doctype,不区分大小写 --> <html lang="zh-cmn-Hans"&g ...
- VS2017 EF本地数据库链接
1. 本地数据库连接 server name可以从链接字符串中取: (localdb)\MSSQLLocalDB 注意少写一个\. { "Logging": { "Inc ...
- 20180831-Linux环境下Python 3.6.6 的安装说明
20180831-Linux环境下Python 3.6.6 的安装说明 摘要:Python3 安装部署,普通用户,编译安装 Author: andy_yhm@yeah.net Date: 201808 ...
- 【记录】Xmind8 Pro 激活
摘要 XMind 是一个全功能的思维导图和头脑风暴软件,为激发灵感和创意而生.作为一款有效提升工作和生活效率的生产力工具,受到全球百千万用户的青睐. [有能力请支持正版] 在xmin下载xmi ...
- SQLServer查询计划
参考:http://blog.csdn.net/luoyanqing119/article/details/17022649 1. 开启方式 菜单栏:query---Display Estimated ...
- SQLServer之创建DML AFTER UPDATE触发器
DML AFTER UPDATE触发器创建原理 触发器触发时,系统自动在内存中创建deleted表或inserted表,inserted表临时保存了插入或更新后的记录行,deleted表临时保存了删除 ...