【链接】 我是链接,点我呀:)

【题意】

在这里输入题意

【题解】

选择的连接肯定是相邻的点对。

那么我们处理出来长度为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的更多相关文章

  1. 【链表】bzoj 1150: [CTSC2007]数据备份Backup

    1150: [CTSC2007]数据备份Backup Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1136  Solved: 458[Submit] ...

  2. [BZOJ 1150] [CTSC2007] 数据备份Backup 【贪心 + 链表】

    题目链接:BZOJ - 1150 题目分析 可以看出,我们选的 k 条边一定是相邻两点之间的线段.我们可以将每条边看成一个点,那么我们就是要在 n-1 个点中选出互不相邻的 k 个,使它们的和最小. ...

  3. bzoj 1150: [CTSC2007]数据备份Backup

    Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家 ...

  4. BZOJ 1150 [CTSC2007]数据备份Backup(贪心+优先队列)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1150 [题目大意] 给出n个数,请你挑出k对(每个数不可重复选取),使得他们差的绝对值 ...

  5. BZOJ 1150 CTSC2007 数据备份Backup 堆+馋

    标题效果:给定一个长度n−1n-1的序列,要求选出kk个不相邻的数使得和最小 费用流显然能跑.并且显然过不去- - 考虑用堆模拟费用流 一个错误的贪心是每次取最小.这样显然过不去例子 我们把[每次取最 ...

  6. bzoj 1150: [CTSC2007]数据备份Backup【链表+堆】

    参考:http://blog.csdn.net/Regina8023/article/details/44158947 神奇的做法.题意相当于若干个数取不相邻的k个使最小.先把数组差分,len表示这段 ...

  7. 【BZOJ 1150】 1150: [CTSC2007]数据备份Backup (贪心+优先队列+双向链表)

    1150: [CTSC2007]数据备份Backup Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设 ...

  8. 1150: [CTSC2007]数据备份Backup

    1150: [CTSC2007]数据备份Backup https://lydsy.com/JudgeOnline/problem.php?id=1150 分析: 堆+贪心. 每次选最小的并一定是最优的 ...

  9. bzoj1150 [CTSC2007]数据备份Backup 双向链表+堆

    [CTSC2007]数据备份Backup Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2727  Solved: 1099[Submit][Stat ...

  10. 【BZOJ1150】[CTSC2007]数据备份Backup 双向链表+堆(模拟费用流)

    [BZOJ1150][CTSC2007]数据备份Backup Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此 ...

随机推荐

  1. [读书笔记] Python 数据分析 (十二)高级NumPy

    da array: 一个快速而灵活的同构多维大数据集容器,可以利用这种数组对整块的数据进行一些数学运算 数据指针,系统内存的一部分 数据类型 data type/dtype 指示数据大小的元组 str ...

  2. Memcached的实战笔记

    官网:http://memcached.org/ 优秀Blogs: http://blog.csdn.net/jingqiang521/article/details/48345021 开启telne ...

  3. spring boot学习(转)

    玩转Spring Boot 前言         首先在这里对Spring Boot做个简单的介绍,对Spring Boot也关注了挺久了,Spring Boot是由Pivotal团队提供的全新框架, ...

  4. 排序(3)---------冒泡排序(C语言实现)

    说到冒泡排序,大一的时候第一次学习这个排序算法,可能大家不知道,"冒泡"在我说的方言里面是吹牛逼的意思. 所以就认为这个排序算法特吹牛逼有木有. 相信大家对全部的排序算法,这个想必 ...

  5. javase复习

    一.总结封装 封装就是将数据和操作数据的方法绑定起来,通过private修饰数据,这样对数据的访问只能通过定义的操作数据的方法get/set来操作数据. 封装优点:1.由于将数据进行了封装,隐藏了不必 ...

  6. ZOJ 3690 Choosing number(dp矩阵优化)

    Choosing number Time Limit: 2 Seconds      Memory Limit: 65536 KB There are n people standing in a r ...

  7. Redis和Memcache和MongoDB简介及区别分析(整理)

    Redis和Memcache 一.Redis简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年 ...

  8. MYSQL 5.7 MHA(GTID+ROW)部署及failover,online_change实战演练

    文章结构如下: 1.MHA简介 Masterhigh availability manager and toolsfor mysql,是日本的一位mysql专家采用perl语言编写的一个脚本管理工具, ...

  9. SpringMVC(三) RESTful架构和文件上传下载

    RESTful架构 REST全名为:Representational State Transfer.资源表现层状态转化.是目前最流行的一种互联网软件架构. 它结构清晰.符合标准.易于理解.扩展方便,所 ...

  10. C++ STL next_permutation() prev_permutation(a,a+n)用法。

    int a[3] = {1,2,3}; a可能形成的集合为{1,2,3},{1,3,2},{2,1,3},{2,3,1},{3,1,2},{3,2,1}. {2,1,3}的prev是{1,3,2}, ...