数据备份[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[]中 题 ...
随机推荐
- 搭建LAMP环境部署discuz论坛
!!!什么是LAMP: LAMP是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写: Linux,操作系统 Apache,网页服务器 MariaDB或MySQL,数据库管理系统(或者 ...
- IT菜鸟之总结(Du teacher)
初次接触云计算,从以前对计算机的一窍不通,经过这三周的学习,起码是通了一窍了:哈哈,至少是对计算机的组成及系统的安装都有了认识,也初次学习了Linux系统,对其的发展和使用有了认识,也学到了一些基础的 ...
- centos 7修改yum源
centos系统要定期更新,前天使用sudo yum update命令更新过程中出错,安装的是x64的系统,结果更新的内容有i686的依赖包,最终由于64与32位系统依赖的原因导致更新失败,更糟糕的是 ...
- idea 使用Springboot 编译报错
报错信息如下 Argument for @NotNull parameter 'url' of org/jetbrains/jps/model/impl/JpsUrlListImpl.addUrl m ...
- Nginx_学习笔记
Nginx_学习笔记 01-Nginx 课程介绍 02-Nginx 的简介 1. 什么是 Nginx ? 03-Nginx 相关概念(正向和反向代理) 1. 什么是反向代理?能否简要画出其示意图 2. ...
- CMOS图像传感器同时感知和处理光学图像
CMOS图像传感器同时感知和处理光学图像 概述 近年来,机器视觉技术有了巨大的飞跃,现在已经成为各种智能系统的一个组成部分,包括自主车辆和机器人.通常,视觉信息由基于帧的摄像机捕获,转换成数字格式,然 ...
- 自动机器学习(AutoML)
自动机器学习(AutoML) 不再需要苦恼于学习各种机器学习的算法 目录: 一.为什么需要自动机器学习 二.超参数优化 Hyper-parameter Optimization 三.元学习 Meta ...
- TensorFlow六种激活函数
TensorFlow六种激活函数 每个神经元都必须有激活函数.神经元提供了模拟复杂非线性数据集所必需的非线性特性.该函数取所有输入的加权和,进而生成一个输出信号.把它看作输入和输出之间的转换.使用适当 ...
- MLPerf结果证实至强® 可有效助力深度学习训练
MLPerf结果证实至强 可有效助力深度学习训练 核心与视觉计算事业部副总裁Wei Li通过博客回顾了英特尔这几年为提升深度学习性能所做的努力. 目前根据英特尔 至强 可扩展处理器的MLPerf结果显 ...
- Java真的是白天鹅
前言 我最近越来越真切的感受到,Java真的是白天鹅. 这真的是一种羡慕嫉妒恨的感受. 今天和一个Java技术Leader聊天,我告诉他敏捷开发是以人为本,他居然跟我说敏捷开发在行业内有规范,规范是死 ...