【BZOJ 1150】[CTSC2007]数据备份Backup
【链接】 我是链接,点我呀:)
【题意】
在这里输入题意
【题解】
选择的连接肯定是相邻的点对。
那么我们处理出来长度为n-1的数组a
其中a[i-1] = dis[i]-dis[i-1]
那么问题就转化成在a数组中取出不相邻的k个数字。
这k个数字的和要求最小。
那么我们把每个数字都加入到堆中去。
然后对于k个数字。
每次取出堆中的最小值x
累加答案
但是这样做可能不是正确的。
因为可能选择x-1,x+1这两个点比单独选择一个点来得更优一些。
(如果你发现选x不是最优的->不选x->那么肯定吧x-1和x+1都选了更好
因此我们得给程序一个"反悔"的机会。
怎么给呢?
我们可以把x-1,x+1两个点的权值和减去x的权值和->temp。
然后加入到堆中去。
然后把x-1,x+1这两个点删掉。
x这个点的权值设置为刚才提到的temp
(这里要注意的一个思想就是,把x-1,x,x+1看成是一个整体,
这样下次如果再选这个x,就表示x不选了而把x-1,x+1选上。
->累加答案
这时仍然把x看成是一个点。
把它左边(此时是x-2)右边(x+2)的点删掉.
然后把a[x-2]+a[x+2]-a[x]再加入到堆中
重复上述步骤就好了
(这个时候-a[x]其实就是把那个"整体"里面选的变成不选,不选的变成选的了
(只有这样,x-2和x+2才能够被选中
(而且x这个整体里面会发现选中的点的个数总是比没选中的点个数多恰好1,所以再把x-2,x+2加上,刚好只会增加一个选择的点
我们每一次取出答案。
其实都只会让选中的点的个数递增1
所以堆中的每个元素其实对应的是,再多选一个点的话。
增加的代价是多少。
而我们每次选的都是最小的代价。
因此贪心的策略是正确的。
【代码】
/**************************************************************
Problem: 1150
User: chengchunyang
Language: C++
Result: Accepted
Time:696 ms
Memory:5260 kb
****************************************************************/
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e5;
const int INF = 1e9+10;
int n,k;
int dis[N+10],a[N+10],L[N+10],R[N+10];
priority_queue<pair<ll,int>,vector<pair<ll,int> >,greater<pair<ll,int> > >pq;
bool vis[N+10];
int main()
{
scanf("%d%d",&n,&k);
for (int i = 1;i <= n;i++) scanf("%d",&dis[i]);
for (int i = 2;i <= n;i++) a[i-1] = dis[i]-dis[i-1];
n--;
a[0] = INF,a[n+1] = INF;
for (int i = 0;i <= n+1;i++) L[i] = i-1,R[i] = i+1;
for (int i = 1;i <= n;i++) pq.push(make_pair(a[i],i));
ll ans = 0;
for (int i = 1;i <= k;i++){
pair<ll,int> x;
do{
x = pq.top();pq.pop();
}while (vis[x.second]);
int id = x.second;
ans+=a[id];
a[id] = a[L[id]]+a[R[id]]-a[id];
pq.push(make_pair(a[id],id));
vis[L[id]] = vis[R[id]] = 1;
R[L[L[id]]] = id;
L[R[R[id]]] = id;
L[id] = L[L[id]];
R[id] = R[R[id]];
}
printf("%lld\n",ans);
return 0;
}
【BZOJ 1150】[CTSC2007]数据备份Backup的更多相关文章
- 【链表】bzoj 1150: [CTSC2007]数据备份Backup
1150: [CTSC2007]数据备份Backup Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1136 Solved: 458[Submit] ...
- [BZOJ 1150] [CTSC2007] 数据备份Backup 【贪心 + 链表】
题目链接:BZOJ - 1150 题目分析 可以看出,我们选的 k 条边一定是相邻两点之间的线段.我们可以将每条边看成一个点,那么我们就是要在 n-1 个点中选出互不相邻的 k 个,使它们的和最小. ...
- bzoj 1150: [CTSC2007]数据备份Backup
Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家 ...
- BZOJ 1150 [CTSC2007]数据备份Backup(贪心+优先队列)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1150 [题目大意] 给出n个数,请你挑出k对(每个数不可重复选取),使得他们差的绝对值 ...
- BZOJ 1150 CTSC2007 数据备份Backup 堆+馋
标题效果:给定一个长度n−1n-1的序列,要求选出kk个不相邻的数使得和最小 费用流显然能跑.并且显然过不去- - 考虑用堆模拟费用流 一个错误的贪心是每次取最小.这样显然过不去例子 我们把[每次取最 ...
- bzoj 1150: [CTSC2007]数据备份Backup【链表+堆】
参考:http://blog.csdn.net/Regina8023/article/details/44158947 神奇的做法.题意相当于若干个数取不相邻的k个使最小.先把数组差分,len表示这段 ...
- 【BZOJ 1150】 1150: [CTSC2007]数据备份Backup (贪心+优先队列+双向链表)
1150: [CTSC2007]数据备份Backup Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设 ...
- 1150: [CTSC2007]数据备份Backup
1150: [CTSC2007]数据备份Backup https://lydsy.com/JudgeOnline/problem.php?id=1150 分析: 堆+贪心. 每次选最小的并一定是最优的 ...
- bzoj1150 [CTSC2007]数据备份Backup 双向链表+堆
[CTSC2007]数据备份Backup Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2727 Solved: 1099[Submit][Stat ...
- 【BZOJ1150】[CTSC2007]数据备份Backup 双向链表+堆(模拟费用流)
[BZOJ1150][CTSC2007]数据备份Backup Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此 ...
随机推荐
- BZOJ 3672 [NOI2014]购票 (凸优化+树剖/树分治)
题目大意: 略 题面传送门 怎么看也是一道$duliu$题= = 先推式子,设$dp[x]$表示到达$x$点到达1节点的最小花费 设$y$是$x$的一个祖先,则$dp[x]=min(dp[y]+(di ...
- koa,express,node 通用方法连接MySQL
这个教程不管node,express,koa都可以用下面方法连接,这里用koa做个参考 这个教程的源码地址: https://github.com/xiaqijian/... 新建文件目录,我是这样子 ...
- python 进程 multiprocessing模块
一.multiprocess.process模块 1.process类 Process([group [, target [, name [, args [, kwargs]]]]]),由该类实例化得 ...
- 小学生都能学会的python(闭包和迭代器)
小学生都能学会的python(闭包和迭代器) 1. 函数名第一类对象 函数名其实就是变量名 1). 可以像变量一样互相赋值. 2). 可以作为函数的参数,进行传递 3). 可以作为返回值返回 4). ...
- IDEA使用快捷键
sout+TAB键---->System.out.println();你可以按ctrl+j里面各种快捷键模板都可以看到. Intellij Idea get/set方法快捷键:Alt+Inse ...
- myeclipse导入工程 Some projects cannot be imported because they already exist in the workspace
问题描述: 1 第一次从外部导入工程或者新建工程,成功: 2 删除该工程,但是没有选择delete project contents on disk 3 再次需要该工程,导入该工程时出现警告:Some ...
- 常用类属于哪些jar包
1.@requestmapping注解,属于org.springframework.web.bind.annotation包下.org.springframework.web jar包. 2.@Res ...
- 怎样注冊 diskgroup 到集群
之前使用 renamedg 对 ora.CRS.dg 进行重命名ora.DUPCRS.dg 可是 renamedg 有个缺点就是无法将改动的信息同步到整个集群层面,并且改动前的dg 会依旧保留在集群 ...
- JavaScript中Array方法总览
title: JavaScript中Array方法总览 toc: true date: 2018-10-13 12:48:14 push(x) 将x添加到数组最后,可添加多个值,返回数组长度.改变原数 ...
- Maven远程仓库:pom依赖以及jar包下载
Maven远程仓库:pom依赖xml配置以及jar包下载: 地址1: http://mvnrepository.com/ 地址2: http://172.16.163.52:8081/nexus/#w ...