博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
题解:[APIO/CTSC 2007]数据备份
阅读量:5338 次
发布时间:2019-06-15

本文共 1780 字,大约阅读时间需要 5 分钟。

 

你在一家 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 
#include
#include
#include
using namespace std;#define re register#define gc getchar()#define ll long long#define il inlineconst int N=100010,lim=(1<<5);const ll INF=1e9;il int read() { re int x(0),f(1); re char ch=gc; while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=gc; } while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=gc; } return x*f;}struct node { long long x,id; bool operator < (const node & a) const { return x>a.x; }};priority_queue
q;int n,k,s[N],la[N],ne[N];bool vis[N];int main() { n=read(),k=read(); for(int i=1; i<=n; ++i) s[i]=read(); for(int i=1; i

 

转载于:https://www.cnblogs.com/zijinjun/p/10596458.html

你可能感兴趣的文章
课堂练习之“寻找水王”
查看>>
css选择器及举例
查看>>
vue中怎么实现获取当前点击对象this
查看>>
hdu2084
查看>>
Android 读取SIM卡参数
查看>>
内存对齐 align
查看>>
jquery复选框
查看>>
数据表格控件 DataGridControl
查看>>
监听器
查看>>
hdu 1496(hash)
查看>>
【转】qt ,使用tcp/ip协议网络传输数据时,字节序转换方法
查看>>
notes
查看>>
策略模式
查看>>
Linux查看硬件信息命令
查看>>
What's New in the .NET Framework 4
查看>>
respondsToSelector的相关使用
查看>>
nginx+apache+php+mysql服务器集群搭建
查看>>
mysql导入source注意点
查看>>
Python: 对于DataFrame.loc传入列表和传入元组输出区别的理解
查看>>
USACO / Sorting a Three-Valued Sequence (简单题,方法正确性待证)
查看>>