数据备份[APIO/CTSC 2007]题解
题目描述
你在一家IT公司为大型写字楼或办公楼的计算机数据做备份。
然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏的乐趣。
已知办公楼都位于同一条街上,你决定给这些办公楼配对(两个一组)。
每一对办公楼可以通过在这两个建筑物之间铺设网络电缆使得它们可以互相备份。
然而,网络电缆的费用很高。
当地电信公司仅能为你提供 K 条网络电缆,这意味着你仅能为 K 对办公楼(总计2K个办公楼)安排备份。
任意一个办公楼都属于唯一的配对组(换句话说,这 2K 个办公楼一定是相异的)。
此外,电信公司需按网络电缆的长度(公里数)收费。
因而,你需要选择这 K 对办公楼使得电缆的总长度尽可能短。
换句话说,你需要选择这 K 对办公楼,使得每一对办公楼之间的距离之和(总距离)尽可能小。
下面给出一个示例,假定你有 5 个客户,其办公楼都在一条街上,如下图所示。
这 5 个办公楼分别位于距离大街起点 1km, 3km, 4km, 6km 和 12km 处。
电信公司仅为你提供 K=2 条电缆。
上例中最好的配对方案是将第 1 个和第 2 个办公楼相连,第 3 个和第 4 个办公楼相连。
这样可按要求使用 K=2 条电缆。
第 1 条电缆的长度是 3km-1km=2km ,第 2 条电缆的长度是 6km-4km=2km。
这种配对方案需要总长 4km 的网络电缆,满足距离之和最小的要求。
输入格式
第一行输入整数n和k,其中 n 表示办公楼的数目,k 表示可利用的网络电缆的数目。
接下来的n行每行仅包含一个整数s,表示每个办公楼到大街起点处的距离。
这些整数将按照从小到大的顺序依次出现。
输出格式
输出应由一个正整数组成,给出将2K个相异的办公楼连成k对所需的网络电缆的最小总长度。
样例输入
5 2
1
3
4
6
12
样例输出
4
数据范围与提示
2≤n≤100000,
1≤k≤n/2,
0≤s≤1000000000
开始做题啦!!!
Frist:思路
首先,因为这道题求的是最小距离和,所以我们要确保每次选的都是当前的最短距离,于是我们就想到了优先队列,每次取出堆顶,将堆顶加入累加和中;
但很快我们就发现题目不可能这么简单,如果最小的距离被选择,那么其相邻的两个距离将不能被选择
换言之,我们会有两种选择方式:
- 选择最小的距离,再从剩下的当中选择去除相邻两距离的最小值;
即:选择d[i],丢弃d[i-1],d[i+1]; - 选择最小距离的相邻两个距离;
即:选择d[i-1] and d[i+1],丢弃d[i];
但因为我们不知道他会用第一还是第二种方案,所以我们就默认他用第一种方案,然后将d[i]赋值为d[i-1]+d[i+1]-d[i];
证明如此赋值的方法是正确的:
首先,根据我们的复制原则,d[i]已经进入了ans,那么如果d[i-1]+d[i+1]-d[i]也进入ans的话,和前面的d[i]一结合,其实ans里面放的就是d[i-1]和d[i+1]的值了然后因为我们输入了两次,刚好和d[i-1],d[i+1]的输入次数一样,所以就证毕啦!!!
代码如下:
#include<bits/stdc++.h>
using namespace std;
struct zz{
int index,v;
friend bool operator < (zz x,zz y){ //重载运算符
return x.v>y.v;
}
};
priority_queue<zz> q;
int n,k;
int l[100005],r[100005],dp[100005]={};
bool f[100005];
long long ans=0;
int main(){
cin>>n>>k;
int x,y;
cin>>x; //优先输入第一位,因为第一位和距离没关系
for(int i=1;i<n;i++){
cin>>y;
dp[i]=y-x;
q.push({i,dp[i]});
l[i]=i-1;
r[i]= i+1==n?0:i+1; /*如果现在输入的是最后一位,那么它没有后继,
所以把它的后继设为0,再将0设为无穷大;*/
x=y;
}
dp[0]=0x3f3f3f3f; //设为无穷大 ;
while(k){
zz now=q.top();
q.pop();
int i=now.index;
if(f[i])
continue; //如果它相邻的距离被提取过,它就不可以被提取 ;
f[l[i]]=1;
f[r[i]]=1; //把它的相邻的距离标记 ;
ans+=dp[i]; //加入总和 ;
dp[i]=dp[l[i]]+dp[r[i]]-dp[i]; //赋值;
q.push({i,dp[i]}); //放入堆;
l[i]=l[l[i]];
r[i]=r[r[i]]; //因为i+1和i-1不能使用,所以把i+1治为i+2,i-1同理;
r[l[i]]=i;
l[r[i]]=i; //反向操作,i+2的相邻距离由i+1变为i,i-2同理;
k--;
}
cout<<ans;
}
数据备份[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)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同 ...
- 题解:[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[]中 题 ...
随机推荐
- [DB] SQL 必知必会
整体架构 数据类型 文本类:CHAR.VARCHAR(可变长度字符,多使用).TEXT.LONGTEXT(文本较大时使用) 数字类:TINYINT.INT.BIGINT.FLOAT.DOUBLE 日期 ...
- K8S的资源管理
K8S的资源管理 管理K8S资源的三种基本方法: 陈述式资源管理方法-使用cli工具进行管理. 声明式资源管理方式-主要依耐资源配置清单. GUI式资源管理方法-主要依耐图形界面. 陈述式资源管理方法 ...
- 007.Ansible变量Fact,魔法变量和lookup生成变量
一 fact变量 1.1 fact简介 ansible有一个模块叫setup,用于获取远程主机的相关信息,并可以将这些信息作为变量在playbook里进行调用.而setup模块获取这些信息的方法就是 ...
- Ansible_包含和导入playbook文件
一.管理大型的playbook 1️⃣:如果playbook很长或很复杂,我们可以将其分成较小的文件以便于管理 2️⃣:可采用模块化方式将多个playbook组合为一个主要playbook,或者将文件 ...
- 配置yum仓库的三种方法光盘镜像、nginx、sftp
方法一: 1.安装ftp服务 [root@oldboy ~]# yum -y install vsftpd 2.查看vsftpd相关的配置文件和目录 rpm -ql vsftpd # 查看vsftpd ...
- 【ArcGIS遇上Python】ArcGIS Python批处理入门到精通实用教程目录
目录 1. 专栏简介 2. 专栏地址 3. 专栏目录 1. 专栏简介 Python语言是目前很火热的语言,极大的促进了人工智能发展.你知道在ArcGIS中也会有python的身影吗?事实上,在ArcG ...
- linux小本
登陆CentOS 2.重启系统:reboot 3.设置客户机显示器分辨率 4.查看IP地址:ip addr 5.切换目录:cd 6.查看目录:ls 7.复制文件:cp 8.编辑文件:vi cd /et ...
- newbee-mall开源项目被慕课网拿去做课程,然后我毫不知情,这又是什么骚操作?
万万没想到,这种事情会发生在我身上. 之前写过<开源囧事>系列而且已经写了四篇,四次开源囧事如下: <开源囧事(一)捅娄子了,写个bug被国家信息安全漏洞共享平台抓到了?> & ...
- python发送丁丁消息
import requests import time import hashlib import hmac import base64 import re def SendMessage(messa ...
- Step By Step(Lua表达式和语句)
Step By Step(Lua表达式和语句) 一.表达式: 1. 算术操作符: Lua支持常规算术操作符有:二元的"+"."-"."*& ...