BZOJ1150 [CTSC2007]数据备份Backup 贪心 堆
欢迎访问~原文出处——博客园-zhouzhendong
去博客园看该题解
题目传送门 - BZOJ1150
题意概括
数轴上面有一堆数字。
取出两个数字的代价是他们的距离。
现在要取出k对数,(一个数字被取出之后就不可再取),问最小代价。
题解
这题貌似哪里做过。
如果取了可以再取,那么我们肯定贪心的选择最短的。
于是我们考虑先把所有的n个点变成n - 1条线段,然后取这些线段。
我们贪心的来。
每次要取掉最短的线段,那么我们用一个堆来维护。
取掉最短的线段之后,我们删除它两端的线段,并修改其值为他 左边的 + 右边的 - 它自己。
那么下一次取这一条线段的时候,就巧妙的变成了取原先的这条线段的两端的线段。
这样就可以了。所以为了维护这个左右线段,我们要用上双向链表。
代码
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <queue>
using namespace std;
const int N=100000+5,Inf=1e9;
void read(int &x){
x=0;
char ch=getchar();
while (!('0'<=ch&&ch<='9'))
ch=getchar();
while ('0'<=ch&&ch<='9')
x=x*10+ch-48,ch=getchar();
}
int n,k,a[N],L[N],R[N],f[N],bh[N];
struct Seg{
int len,pos,bh;
bool operator < (const Seg a) const{
return len>a.len;
}
}s;
Seg new_Seg(int a,int b,int c){
Seg res;
res.len=a,res.pos=b,res.bh=c;
return res;
}
priority_queue <Seg> q;
void Delete(int pos){
if (pos==1||pos==n+1)
return;
f[pos]=1;
R[L[pos]]=R[pos];
L[R[pos]]=L[pos];
}
int main(){
read(n),read(k);
for (int i=1;i<=n;i++)
read(a[i]);
for (int i=n;i>1;i--)
a[i]-=a[i-1];
for (int i=1;i<=n+1;i++)
L[i]=i-1,R[i]=i+1;
a[1]=a[n+1]=Inf;
while (!q.empty())
q.pop();
memset(f,0,sizeof f);
memset(bh,0,sizeof bh);
for (int i=2;i<=n;i++)
q.push(new_Seg(a[i],i,0));
int ans=0;
while (k--){
s=q.top();
while (f[s.pos]||bh[s.pos]!=s.bh)
q.pop(),s=q.top();
ans+=s.len;
int pos=s.pos,le=L[pos],ri=R[pos];
q.push(new_Seg(a[pos]=a[le]+a[ri]-a[pos],pos,++bh[pos]));
Delete(le);
Delete(ri);
}
printf("%d",ans);
return 0;
}
BZOJ1150 [CTSC2007]数据备份Backup 贪心 堆的更多相关文章
- bzoj1150 [CTSC2007]数据备份Backup 双向链表+堆
[CTSC2007]数据备份Backup Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2727 Solved: 1099[Submit][Stat ...
- BZOJ1150 [CTSC2007] 数据备份Backup 贪心_堆_神题
Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家 ...
- BZOJ1150 [CTSC2007]数据备份Backup 【堆 + 链表】
题目 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏的 ...
- BZOJ1150 [CTSC2007]数据备份Backup 链表+小根堆
BZOJ1150 [CTSC2007]数据备份Backup 题意: 给定一个长度为\(n\)的数组,要求选\(k\)个数且两两不相邻,问最小值是多少 题解: 做一个小根堆,把所有值放进去,当选择一个值 ...
- 【BZOJ1150】[CTSC2007]数据备份Backup 双向链表+堆(模拟费用流)
[BZOJ1150][CTSC2007]数据备份Backup Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此 ...
- BZOJ1150[CTSC2007]数据备份Backup——模拟费用流+堆+链表
题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游 ...
- bzoj1150: [CTSC2007]数据备份Backup
题目大意: 在n个点中,选出k对相邻的互不相同的点,使k段距离的总和最小. 贪心,双向链表. 首先,点之间的距离是动态的,所以要用堆来维护. 每次都选择最近的点.但因为其他情况,可能最终不会选择这 ...
- 【BZOJ 1150】 1150: [CTSC2007]数据备份Backup (贪心+优先队列+双向链表)
1150: [CTSC2007]数据备份Backup Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设 ...
- 【链表】bzoj 1150: [CTSC2007]数据备份Backup
1150: [CTSC2007]数据备份Backup Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1136 Solved: 458[Submit] ...
随机推荐
- Emacs org-mode导出html出错
不知道为什么,当org文件中含有#+TITLE:xxx时,导出会报类似下面的错误: Wrong type argument: listp, #("xxx" 0 3 (:parent ...
- 20155331 2016-2017-2 《Java程序设计》第七周学习总结
20155331 2016-2017-2 <Java程序设计>第七周学习总结 教材学习内容总结 一.认识Lambda语法 1.Lambda语法概览 Arrays的sort()方法可以用来排 ...
- dense prediction
Dense prediction fully convolutional network for sementic segmentation 先用feature extractor 提特征,然后再使 ...
- C++内存管理(转)http://www.cnblogs.com/qiubole/archive/2008/03/07/1094770.html
[导语] 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不 ...
- resolution will not be reattempted until the update interval of repository-group has elapsed or updates are forced
Failed to execute goal on project safetan-web: Could not resolve dependencies for project com.safeta ...
- MySQL或MariaDB忘记root密码
当我们忘记数据库密码时,我们可以通过如下来修改! 编辑配置文件(提前最好进行备份) 然后重启服务 systemctl restart mariadb 或者 systemctl restart mysq ...
- Jetson tk1 安装 Intel 7260 无线网卡驱动
Jseton TK1上没有集成的无线网卡,开发板上有一个mini pci-e接口,可以插入Intel 7260这款继承了wifi和蓝牙功能的无线网卡: 该网卡实物如下图,在淘宝和Amazon上都可以买 ...
- np.savetxt()——将array保存到txt文件,并保持原格式
问题:1.如何将array保存到txt文件中?2.如何将存到txt文件中的数据读出为ndarray类型? 需求:科学计算中,往往需要将运算结果(array类型)保存到本地,以便进行后续的数据分析. 解 ...
- 腾讯云外网IP直通后,遇到网络问题
通过内网机器,先重启网卡 service network restart cd /usr/local/etc ./modify_route.sh
- Android数据存储:File
Android数据存储之File Files:它通过FileInputStream和FileOuputStream对文件进行操作.但是在Android中,文件是一个应用程序私有的,一个应用程序无法读写 ...