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] ...
随机推荐
- centos7 redmine安装过程
mysql安装配置 redmine 部署过程 redmin官方文档写的太烂加上不熟悉ruby搞了半天,回到家后觉得还是记录下好,希望可以帮助有需要的人,少走弯路. 版本说明 下面的版本很重要re ...
- POJ1258 Agri-Net【最小生成树】
题意: 有n个农场,已知这n个农场都互相相通,有一定的距离,现在每个农场需要装光纤,问怎么安装光纤能将所有农场都连通起来,并且要使光纤距离最小,输出安装光纤的总距离. 思路: 又是一个最小生成树,因为 ...
- Python 成仙之路
这个部分的所有内容,都是我学习Python过程中的学习笔记. 这个部分的所有内容,都是我学习Python过程中的学习笔记. 这个部分的所有内容,都是我学习Python过程中的学习笔记. 第一部分 p ...
- weblogic中部署SSH项目遇到的坑
总结将SSH项目部署到weblogic遇到的坑.项目中是SSH,另外还用到了webservice.quartz等框架.在tomcat部署是可以的,现在总结部署到weblogic遇到的坑. 在这里说一下 ...
- Docker帮助命令
①docker version ②docker info ③docker --help
- motor的使用
# -*- coding: utf-8 -*- # @Time : 2018/11/18 10:41 PM # @Author : cxa # @File : motordb.py # @Softwa ...
- CentOS 6.5环境实现corosync+pacemaker实现DRBD高可用
DRBD (Distributed Replicated Block Device)分布式复制块设备,它是 Linux 平台上的分散式储存系统,通常用于高可用性(high availability, ...
- mac安装RabbitMQ
1 下载 地址 http://www.rabbitmq.com/install-standalone-mac.html 2 rabbitmq的安装目录: /Users/ysyc1/rabbitmq_s ...
- 生活工作必备之SMART原则
所谓SMART原则,即: 1. 目标必须是具体的(Specific) 2. 目标必须是可以衡量的(Measurable) 3. 目标必须是可以达到的(Attainable) 4. 目标必须和主要目标具 ...
- win7 X64系统上 PL/SQL不能识别Oracle实例
电脑系统为Win7 64位,安装的PLSql为64位,安装的Oracle客户端为运行时类型的,应该为32位客户端 电脑上之前安装的32位toad可以识别Oracle实例 在系统添加了oracle_ho ...