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)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏的 ...
随机推荐
- mantis安装
curl -O http://jaist.dl.sourceforge.net/project/mantisbt/mantis-stable/1.2.19/mantisbt-1.2.19.tar.gz ...
- java 15 - 6 List的方法
List集合的特有功能: A:添加功能 void add(int index,Object element):在指定索引处添加元素 B:获取功能 Object get(int index):获取指定索 ...
- Android优化—— 内存分析工具 MAT 的使用
1 内存泄漏的排查方法 Dalvik Debug Monitor Server (DDMS) 是 ADT插件的一部分,其中有两项功能可用于内存检查 : · heap 查看堆的分配情况 · ...
- result默认返回action中的所有数据,要想返回指定的数据怎么做呢
result默认返回action中的所有数据,要想返回指定的数据怎么做呢?
- 有一家做BPM的公司叫K2,Gartner和IDC都说好!
有一家公司被Gartner称为成长最快速的BPMS厂商,被IDC称为破坏性创新者… IDC及Gartner均称K2为成长最快速的商务流程管理套装平台(BPMS)厂商.IDC称K2为“破坏性创新者,在关 ...
- [tools]QuickPing
一款神器 quickping 能够很快的探测出该网断分出去哪些地址. 在线的会显示绿色 在线的+有主机名的显示为亮绿色
- linux下c++开发环境安装(eclipse+cdt)
方法一: 此外,众所周知,Eclipse是Java程序,因此很容易就实现了跨平台,也是众所周知,Java的大型程序非常吃内存,即使有512MB内存, 仍然感觉Eclipse的启动速度很慢.个人认为1G ...
- 【JS笔记】私有变量
1.任何函数中定义的变量都可以认为是私有变量.函数内部可以访问,外部不能访问. 可以通过闭包创建特权方法访问私有变量. function Foo(){ var n=10; this.returnN=f ...
- C#异步编程一
前几天把Code First系列总结完,想着下步总结什么,原本想着XML,不过XML的内容比较多,还有3天班就中秋节了,想在中秋节前在完成一个系列,所以决定把异步这块总结下.说起异步可能会认为就是多线 ...
- springmore-让编程更容易
这是我多年项目的总结,并将其抽象出来,形成一个开源的项目 部分借鉴springside,将更多的实践总结进来 基于spring+ibatis+springMVC springmore-core专注于一 ...