题目大意:将k对点两两相连,求最小长度

易证得,最优方案中,相连的办公楼一定是取相邻的比取不相邻的要更优

然后就可以用贪心来做这道题了。。

之前向CZL大神学习了用堆来贪心的做法orz

大概思路就是将初始所有的线段放进堆里

每次取最短的线段进行连接,且ans+=a[i]

取完后删除当前线段,与相邻的两条线段,同时再插入新边,权值为a[pre]+a[next]-a[now]

其作用与最大流中的反向弧有点像,下一次若取到这条边,即ans+=a[pre]+a[next]-a[now]

很明显a[now]与之前抵消了,即不取now,反而取相邻的两条边去了

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 #include<queue>
 5 using namespace std;
 6 const int maxn = 200020*2;
 7 struct node{
 8     int id;
 9 };
10 priority_queue<node> Q;
11 int pre[maxn],next[maxn],k,a[maxn],n;
12 bool del[maxn];
13 int tot,last,now,ans;
14
15 bool operator<(node x, node y){
16     return a[x.id]>a[y.id];
17 }
18
19 int main(){
20     scanf("%d%d", &n, &k);
21     scanf("%d", &last);
22     tot=0;
23     for (int i=1; i<n; i++){
24         scanf("%d", &now);
25         a[++tot]=now-last;
26         last=now;
27     }
28     for (int i=1; i<n; i++){
29         Q.push((node){i});
30         pre[i]=i-1; next[i]=i+1;
31     }
32     pre[1]=next[tot]=0;
33     a[0]=1002000000;   // Attention:不能是maxlongint,因为后面a[++tot]会爆
34     while (k--){
35         while (!Q.empty() && del[Q.top().id]) Q.pop();
36         if (Q.empty()) break;
37         int now=Q.top().id; ans+=a[now]; Q.pop();
38
39         int l=pre[now],r=next[now];
40         del[now]=del[l]=del[r]=1;
41
42         a[++tot]=a[l]+a[r]-a[now]; Q.push((node){tot});
43
44         pre[tot]=pre[l]; next[tot]=next[r];
45         if (pre[tot]) next[pre[tot]]=tot;
46         if (next[tot]) pre[next[tot]]=tot;
47     }
48     printf("%d\n", ans);
49     return 0;
50 }

转载于:https://www.cnblogs.com/mzl120918/p/5467132.html

bzoj1150: [CTSC2007]数据备份Backup--贪心+优先队列维护堆相关推荐

  1. BZOJ1150[CTSC2007]数据备份Backup——模拟费用流+堆+链表

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

  2. bzoj1150 [CTSC2007]数据备份Backup

    大概就是写了道生日礼物那个不知道叫啥的贪心..... 大概就是说这道题和那个比较像... 所以留着看看吧,哪天想起了回来做这道题咯~ 转载于:https://www.cnblogs.com/LLppd ...

  3. [BZOJ1150][CTSC2007]数据备份Backup

    首先肯定要选择相邻的公司配对才会距离最小 先把两两之间的距离加入小根堆中 每次取出堆顶,加入答案,删掉左右线段,再扔进去len[l]+len[r]-len[now] 这样如果这个新点被取到,说明取两边 ...

  4. P3620-[APIO/CTSC2007]数据备份【贪心,堆,链表】

    正题 题目链接:https://www.luogu.com.cn/problem/P3620 题目大意 一条线上有nnn个位置,选出kkk对使得它们的距离差之和最小. 解题思路 因为一定是连接相邻的最 ...

  5. [APIO / CTSC2007]数据备份 --- 贪心

    [APIO / CTSC 2007]数据备份 题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份. 然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同的办公 ...

  6. [APIO/CTSC 2007]数据备份(贪心+堆)

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

  7. 专题突破二之优先队列、st表——,Running Median,Sequence,Buy Low Sell High,数据备份,超级钢琴,ZQC的手办

    文章目录 Running Median Sequence Buy Low Sell High [APIO/CTSC 2007] 数据备份 [NOI2010] 超级钢琴 「LibreOJ β Round ...

  8. Right Backup(云端数据备份软件)v8.1官方版

    Right Backup是一款云端数据备份软件,Right Backup为您的数据提供一站式云存储解决方案,在云中备份您的所有文档.照片.音乐和其他重要的资料,在出现不幸的数据丢失时保持安全! 软件特 ...

  9. Android数据备份(Android Data Backup)

    最近我在阅读Android Developer上的文章,本文是对其中一篇Data Backup的翻译.希望可以通过翻译英文技术文章提高自己阅读英文文档的水平,如果有不妥的地方,希望指出,谢谢~因为这个 ...

最新文章

  1. 自定义Linq的Distinct
  2. 跳槽时,这些Java面试题99%会被问到
  3. php开源 饭馆记账软件_GitHub - CNYoki/xxjzWeb: 小歆记账WebApp项目(Web服务端)
  4. 12月16日文章排行点评及编辑部训练
  5. python遍历文件对象_Python文件常见操作实例分析【读写、遍历】
  6. SAP Commerce Cloud 2011装好之后,访问Accelerator时遇到错误
  7. Perl split字符串分割函数用法指南
  8. 想要学好C++有哪些技巧?
  9. js识别用户设备是移动端手机时跳转到手机网站
  10. R语言_缺失值NA的处理
  11. java审批工作流,值得一读!
  12. 数据来源渠道及采集工具_几款简单好用的爬虫抓取数据采集工具
  13. 用树莓派搭建公网个人下载平台aria2-pro,推荐6个优质种子资源站
  14. 你是什么命,好玩的很
  15. java魔界战记魔女_魔界战记风格RPG《魔女传说》最新公开!
  16. thymeleaf中th:href携带参数的三种写法
  17. 如何考量私有云的解决方案
  18. 移动APP整体策划-004-App注册登录系统策划方案
  19. 电子时钟的设计与实现
  20. 金蝶云系统服务器,金蝶云平台

热门文章

  1. 在Linux下安装和使用MySQL(转)
  2. CVPR自动驾驶运动预测挑战赛:轻舟智航夺冠方案
  3. GridMask:SOTA 数据增广方法,显著改进分类、检测、分割效果
  4. DeepMindVGG提出基于集合的人脸识别算法GhostVLAD,精度远超IJB-B数据集state-of-the-art...
  5. 重磅!清华商汤开源CVPR2018超高精度人脸对齐算法LAB
  6. python批处理将图片进行放大实例代码
  7. 谷歌、DeepMind提出高效Transformer评估基准
  8. 线性二次型最优控制器LQR设计原理以及matlab实现
  9. mysql查询到最新记录就停止_使用Limit参数优化MySQL查询 在找到一个记录后将停止查询...
  10. 滴滴人脸识别申诉照片怎么拍_涅槃乐队Nevermind封面照片是怎么拍出来的?