题目描述

你在一家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:思路

首先,因为这道题求的是最小距离和,所以我们要确保每次选的都是当前的最短距离,于是我们就想到了优先队列,每次取出堆顶,将堆顶加入累加和中;

但很快我们就发现题目不可能这么简单,如果最小的距离被选择,那么其相邻的两个距离将不能被选择

换言之,我们会有两种选择方式:

  1. 选择最小的距离,再从剩下的当中选择去除相邻两距离的最小值;
    即:选择d[i],丢弃d[i-1],d[i+1];
  2. 选择最小距离的相邻两个距离;
    即:选择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]题解的更多相关文章

  1. 洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心)

    洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/132 ...

  2. P3620 [APIO/CTSC 2007]数据备份

    P3620 [APIO/CTSC 2007]数据备份 题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同 ...

  3. 洛谷 P3620 [APIO/CTSC 2007]数据备份 解题报告

    P3620 [APIO/CTSC 2007]数据备份 题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同 ...

  4. 题解:[APIO/CTSC 2007]数据备份

    你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏的乐趣.已 ...

  5. [luogu3620][APIO/CTSC 2007]数据备份【贪心+堆+链表】

    题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏 ...

  6. [APIO/CTSC 2007]数据备份(贪心+堆)

    你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏的乐趣. ...

  7. 洛谷P3620 [APIO/CTSC 2007] 数据备份 [堆,贪心,差分]

    题目传送门 题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽 ...

  8. P3620 [APIO/CTSC 2007]数据备份[优先队列+贪心]

    题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏 ...

  9. 题解 P3620 【[APIO/CTSC 2007]数据备份】

    直接贪心(每次选最小)的话显然不对...样例都过不了... 选两个办公楼的时候,显然不能跨越另一个楼,这样不优... 于是 先把原数列处理成n-1个的数(每一个办公楼和上一个的距离),存在a[]中 题 ...

随机推荐

  1. n/a或N/A是英语“不适用”(Not applicable)

    n/a或N/A是英语"不适用"(Not applicable)等类似单词的缩写,常可在各种表格中看到. N/A比较多用在填写表格的时候,表示"本栏目(对我)不适用&quo ...

  2. [python3.7]列表

    >>> a['aaa']>>> b=['aasd','sss','cc']>>> a.extend(b)>>> a['aaa', ...

  3. 运维实战案例之“Too many open files”错误与解决方法

    运维实战案例之"Too many open files"错误与解决方法   技术小甜 2017-11-16 15:02:00 浏览869 服务器 shell tomcat 脚本 o ...

  4. mysql示例及练习2

    #创建数据库并应用create database shopdb;use shopdb;#创建表customerscreate table customers(c_id int primary key ...

  5. 解决Windows路径太长的目录以及文件名超长删除的问题

    因Windows文件夹有长度限制,在路径太深,长度达到600多个字符时,删除文件时出现报错"源文件名长度大于文件系统支持的长度.请尝试将其移动到具有较短路径名称的位置,或者在执行此操作前尝试 ...

  6. 『动善时』JMeter基础 — 24、JMeter中使用“用户参数”实现参数化

    目录 1.用户参数组件介绍 2.用户参数界面介绍 3.使用"用户参数"组件实现参数化 (1)测试计划内包含的元件 (2)线程组元件内容 (3)HTTP请求组件内容 (4)用户参数组 ...

  7. Jquery的load加载本地文件出现跨域错误的解决方案"Access to XMLHttpRequest at 'file:///android_asset/web/graph.json' from(Day_46)

    博主是通过JS调用本地的一个json文件赋值给变量出现的跨域错误, 网上有大量文章,五花八门的,但总归,一般性此问题基本可通过这三种方法解决: https://blog.csdn.net/qq_418 ...

  8. [leetcode] 45. 跳跃游戏 II(Java)(动态规划)

    45. 跳跃游戏 II 动态规划 此题可以倒着想. 看示例: [2,3,1,1,4] 我们从后往前推,对于第4个数1,跳一次 对于第3个数1,显然只能跳到第4个数上,那么从第3个数开始跳到最后需要两次 ...

  9. deeplearning模型库

    deeplearning模型库 1. 图像分类 数据集:ImageNet1000类 1.1  量化 分类模型Lite时延(ms) 设备 模型类型 压缩策略 armv7 Thread 1 armv7 T ...

  10. AlexeyAB DarkNet YOLOv3框架解析与应用实践(二)

    AlexeyAB DarkNet YOLOv3框架解析与应用实践(二) 版本3有什么新功能? YOLOv3使用了一些技巧来改进训练和提高性能,包括:多尺度预测.更好的主干分类器等等.全部细节都在我们的 ...