BZOJ 1150--数据备份(链表&堆&贪心)
1150: [CTSC2007]数据备份Backup
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 2572 Solved: 1038
[Submit][Status][Discuss]
Description

Input
输入的第一行包含整数n和k,其中n(2 ≤ n ≤100 000)表示办公楼的数目,k(1≤ k≤ n/2)表示可利用的网络电缆的数目。接下来的n行每行仅包含一个整数(0≤ s ≤1000 000 000), 表示每个办公楼到大街起点处的距离。这些整数将按照从小到大的顺序依次出现。
Output
输出应由一个正整数组成,给出将2K个相异的办公楼连成k对所需的网络电缆的最小总长度。
Sample Input
1
3
4
6
12
Sample Output
题目链接:
http://www.lydsy.com/JudgeOnline/problem.php?id=1150
Solution
显然最优解一定满足每条电缆都要连接两个相邻的办公楼,否则会有更优的解。。。
假如对于一条已知的最短的边,但如果要求连接两条电缆。。。
就会存在最短边的两边恰好是最优解的状态。。。所以要用链表维护一下。。。
代码
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<vector>
#define LL long long
#define maxn 100005
#define inf 2000000000
using namespace std;
int n,k;
priority_queue< pair<int,int>, vector< pair<int ,int> > ,greater< pair<int,int> > >q;
int l[maxn],r[maxn],t[maxn],s[maxn];
bool mark[maxn];
void del(int x){
mark[x]=1;
int left=l[x],right=r[x];
l[x]=r[x]=0;
r[left]=right;
l[right]=left;
}
int main(){
LL ans=0;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%d",&s[i]);
l[i]=i-1;
r[i]=i+1;
}
t[1]=inf;t[n+1]=inf;
q.push(make_pair(t[1],1));
q.push(make_pair(t[n+1],n+1));
for(int i=2;i<=n;i++){
t[i]=s[i]-s[i-1];
q.push(make_pair(t[i],i));
}
for(int i=1;i<=k;i++){
while(mark[q.top().second])q.pop();
int x=q.top().second;
ans+=t[x];
q.pop();
t[x]=t[l[x]]+t[r[x]]-t[x];
del(l[x]);
del(r[x]);
q.push(make_pair(t[x],x));
}
printf("%lld\n",ans);
return 0;
}
This passage is made by Iscream-2001.
BZOJ 1150--数据备份(链表&堆&贪心)的更多相关文章
- BZOJ_1150_[CTSC2007]数据备份Backup_堆+贪心
BZOJ_1150_[CTSC2007]数据备份Backup_堆+贪心 Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏 ...
- BZOJ 1150 - 数据备份Backup - [小顶堆][CTSC2007]
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1150 Time Limit: 10 Sec Memory Limit: 162 M De ...
- [BZOJ 1150] 数据备份
Link:https://www.lydsy.com/JudgeOnline/problem.php?id=1150 Solution: 思路和洛谷P1484完全相同 只不过将求最大不相邻的点权改为最 ...
- [BZOJ 1150] [CTSC2007] 数据备份Backup 【贪心 + 链表】
题目链接:BZOJ - 1150 题目分析 可以看出,我们选的 k 条边一定是相邻两点之间的线段.我们可以将每条边看成一个点,那么我们就是要在 n-1 个点中选出互不相邻的 k 个,使它们的和最小. ...
- 【BZOJ 1150】 1150: [CTSC2007]数据备份Backup (贪心+优先队列+双向链表)
1150: [CTSC2007]数据备份Backup Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设 ...
- [CTSC2007]数据备份Backup (贪心)
题面 Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐 ...
- 2288.【POJ Challenge】生日礼物 链表+堆+贪心
BZOJ2288 [POJ Challenge]生日礼物 题意: 给一个长度为\(n\)的数组,最多可以选\(m\)个连续段,问选取的最大值是多少 题解: 先把连续的符号相同的值合并,头和尾的负数去掉 ...
- BZOJ 1150 CTSC2007 数据备份Backup 堆+馋
标题效果:给定一个长度n−1n-1的序列,要求选出kk个不相邻的数使得和最小 费用流显然能跑.并且显然过不去- - 考虑用堆模拟费用流 一个错误的贪心是每次取最小.这样显然过不去例子 我们把[每次取最 ...
- BZOJ 1150 [CTSC2007]数据备份Backup(贪心+优先队列)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1150 [题目大意] 给出n个数,请你挑出k对(每个数不可重复选取),使得他们差的绝对值 ...
随机推荐
- col标签的相关实验
col上有width属性,如果对应值没有单位,默认是像素 <!DOCTYPE html> <html> <head> <title>col相关实验< ...
- rundeck
docker run -d -p 4440:4440 -e EXTERNAL_SERVER_URL=http://109.105.4.65:4440 -v/root/rundeck:/var/rund ...
- FD_CLOEXEC
[FD_CLOEXEC] 通过fcntl设置FD_CLOEXEC标志有什么用? close on exec, 意为如果对描述符设置了FD_CLOEXEC,使用execl执行的程序里,此描述符被关闭,不 ...
- 27.Remove Element(Array)
Given an array and a value, remove all instances of that value in place and return the new length. T ...
- $_SERVER['PHP_AUTH_USER']
PHP 的 HTTP 认证机制仅在 PHP 以 Apache 模块方式运行时才有效,因此该功能不适用于 CGI 版本.在 Apache 模块的 PHP 脚本中,可以用 header() 函数来向客户端 ...
- ios 7.1企业证书无线安装
ios升级到7.1时,企业证书http服务器发布无线安装不能使用,需要使用https服务器. 测试了几种方式 1.测试时自签名https证书测试无效,提示不能连接到服务器 2.使用dropbox共享连 ...
- golang之切片与排序
1.排序与查找操作 排序操作在sort包中,sort.Ints对整数进行排序,sort.Strings对字符串进行排序,sort.Float64对浮点数进行排序 package main import ...
- 利率计算v4.0--测试--软件工程
利率计算v4.0--测试 package Test; import Model.Interest; import Service.CompoundInterestService; import Ser ...
- Differential expression analysis for paired RNA-seq data 成对RNA-seq数据的差异表达分析
Differential expression analysis for paired RNA-seq data 抽象背景:RNA-Seq技术通过产生序列读数并在不同生物条件下计数其频率来测量转录本丰 ...
- git忽略某个文件
data/config/config.ini.php