Bzoj1150 数据备份Backup
Description
Input
Output
输出应由一个正整数组成,给出将2K个相异的办公楼连成k对所需的网络电缆的最小总长度。
Sample Input
5 2
1
3
4
6
12
Sample Output
4
维护一个记录建筑物间隔距离的小根堆,贪心每次取走堆顶,累计答案。
假设有相邻的三个间隔x,mid,y,其中mid最小,尽管按照贪心的策略应该取走mid,但从整体上来看,取走x和y可能解更优。为了使得解“可以更新得更优”,当取走mid的时候,
可以删除x和y,再向堆中添加一个长度为x+y-mid的元素。这样,当取走一个新元素,对答案的贡献值等于x+y,相当于取走两边。
代码如下:
其中49和57行的操作使得堆外的结构体数组同步更新,是很重要的步骤。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int INF=1e9;
const int mxn=;
struct line{
int len;//长度
int pr,ne;//链表
int mark;//删除标记
}e[mxn];
bool operator <(const line x,const line y){
return x.len>y.len;//用以构建小根堆
}
bool del[mxn*];
long long ans=;
int cnt=;
int n,m;
int k;
priority_queue<line>q;
int main(){
scanf("%d%d",&n,&k);
int i,j;
int dis,last=;
for(i=;i<=n;i++){
scanf("%d",&dis);
e[++cnt].len=dis-last;
last=dis;
e[i].pr=cnt-;
e[i].ne=cnt+;
e[i].mark=cnt;
}
e[].pr=;e[].ne=;e[].len=INF;e[].mark=;//维护边缘
cnt++;
e[cnt].pr=cnt;e[cnt].ne=cnt;e[cnt].len=INF;e[cnt].mark=cnt;// for(i=;i<=cnt;i++) q.push(e[i]);//存线段
while(k){
line now=q.top();
if(del[now.mark]){ //如果有删除标记,弹出
q.pop();
continue;
}
else{//如果没有删除标记
ans+=now.len;
q.pop();
now=e[now.mark];//取值
k--;
del[now.pr]=;del[now.ne]=;//添加删除标记
now.len=e[now.pr].len+e[now.ne].len-now.len;
now.pr=e[now.pr].pr;//维护双向链表
now.ne=e[now.ne].ne;
e[now.pr].ne=now.mark;
e[now.ne].pr=now.mark;
e[now.mark]=now;//更新值
q.push(now);
}
}
printf("%lld",ans);
return ;
}
Bzoj1150 数据备份Backup的更多相关文章
- 【BZOJ1150】[CTSC2007]数据备份Backup 双向链表+堆(模拟费用流)
[BZOJ1150][CTSC2007]数据备份Backup Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此 ...
- BZOJ1150 [CTSC2007]数据备份Backup 链表+小根堆
BZOJ1150 [CTSC2007]数据备份Backup 题意: 给定一个长度为\(n\)的数组,要求选\(k\)个数且两两不相邻,问最小值是多少 题解: 做一个小根堆,把所有值放进去,当选择一个值 ...
- bzoj1150 [CTSC2007]数据备份Backup 双向链表+堆
[CTSC2007]数据备份Backup Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2727 Solved: 1099[Submit][Stat ...
- 【链表】bzoj 1150: [CTSC2007]数据备份Backup
1150: [CTSC2007]数据备份Backup Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1136 Solved: 458[Submit] ...
- 1150: [CTSC2007]数据备份Backup
1150: [CTSC2007]数据备份Backup https://lydsy.com/JudgeOnline/problem.php?id=1150 分析: 堆+贪心. 每次选最小的并一定是最优的 ...
- 【BZOJ 1150】 1150: [CTSC2007]数据备份Backup (贪心+优先队列+双向链表)
1150: [CTSC2007]数据备份Backup Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设 ...
- 【bzoj1150】[CTSC2007]数据备份Backup 模拟费用流+链表+堆
题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏 ...
- BZOJ1150[CTSC2007]数据备份Backup——模拟费用流+堆+链表
题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游 ...
- BZOJ1150 [CTSC2007]数据备份Backup 【堆 + 链表】
题目 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏的 ...
随机推荐
- git冲突解决办法
git错误error: Your local changes to the following files would be overwritten 然后可以使用git diff -w +文件名 来确 ...
- C语言中,&和&&都是做什么的?
&按位&&逻辑与 逻辑运算符把各个运算的变量(或常量)连接起来组成一个逻辑表达式.逻辑运算符有4个,它们分别是: !(逻辑非). ||(逻辑或).&&(逻辑与) ...
- CPU相关知识-寄存器与存储器的区别
存储器一般在CPU外,一般指硬盘,U盘等可以在切断电源后保存资料的设备,容量一般比较大,缺点是读写速度都很慢,普通的机械硬盘读写速度一般是 50MB/S左右.内存和寄存器就是为了解决存储器读写速度慢而 ...
- java8-4 多态的练习以及题目
1./* 多态练习:猫狗案例*/ class Animal { public void eat(){ System.out.println("吃饭"); } } class Dog ...
- Android 动态加载 (三) PAK 详解
pak文件经常出现于游戏的安装目录中,其实pak文件是一种特殊的游戏压缩文件,用于压缩声音.图片等资料.由于pak文件专门针对游戏设计文件结构,pak文件就是将多个文件(图片.音乐.文本)打包为一个单 ...
- Spring MVC之cookies跟session 数据绑定
在我最早接触web开发的中学时代,学习的asp技术对于session的概念其实很清楚 Session("username")="张三"下次要用的时候,直接用se ...
- 搭建一个Web应用
因为EasyUI会涉及到与后台数据的交互,所以使用Spring MVC作为后台,搭建一个完整的Web环境 使用gradle作为构建工具 build.gradle group 'org.zln.lkd' ...
- 22Spring_JdbcTemplatem模板工具类的使用——使用外部属性文件来配置(properties)
前一篇文章写得是xml文件来配置数据库连接的.但是为了方便,我们实际中采用的是properties文件的方式来配置数据库的.修改properties 文件 会比 修改 xml文件 方便. 做法是: 将 ...
- TabControl的SelectionChanged事件
DataGrid作为TabControl控件的TabItem的content元素. 当操作DataGrid的不同cell时,会引发了TabControl的SelectionChanged事件的问题. ...
- [服务]ftp主动模式和被动模式
经常忘记这个东西.于是总结下这东西感受下这个协议. FTP连接方式 控制连接:标准端口为21,用于发送FTP命令信息 数据连接:标准端口为20,用于上传.下载数据 数据连接的建立类型: 主动模式:服务 ...