直接贪心(每次选最小)的话显然不对...样例都过不了... 选两个办公楼的时候,显然不能跨越另一个楼,这样不优... 于是 先把原数列处理成n-1个的数(每一个办公楼和上一个的距离),存在a[]中 题目就是 要求选出K个不相邻的数,使得选出的数的和最小

依然考虑贪心,每次选最小的 但是若a[]是2 1 2 6,要选K=2个,先选了1,然后会发现两个2都没法选,只好选6,这样就尴尬了... 1选了就选了吧,我们考虑补救措施... 就是选1的时候,在堆里删掉两个2,然后在堆中插入2+2-1 相当于 我们以后可以取到那两个2,而且2+2-1可以表示选了两个数,因为刚才选了1,所以在这里-1

还有个边界问题...比如取了第一个数或最后一个数,那么把a[0]和a[n]赋成极大值呗...

因为边界的数 的两侧 只有一个有效的数,无法补救了(补救的时候需要俩数...),赋成极大值那么以后都无法取到

那就要存储 一个数的前一个数是多少,后一个数是多少(方便删除)

7 2 1 2 6 8 取1,删掉俩2,然后新开一个链表空间a[++n],存储2+2-1,用这个链表空间取代2 1 2

新的链表空间,前驱是7所在位置,后继是6所在位置...不要忘了修改 7和6 的前驱和后继...

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 100009
using namespace std;
int n,dis[N],la,lheap,heap[N<<],pos[N<<],K,now,point[N<<][],prev,next;
long long a[N<<],ans;
inline void push(int x)
{
int i=++lheap;
heap[i]=x;
pos[x]=i;//pos用来记录链表a[]第x个位置 在堆中的位置
while (i>)
if (a[ heap[i] ]<a[ heap[i/] ])
{
swap(heap[i],heap[i/]);
swap(pos[ heap[i] ],pos[ heap[i/] ]);
i>>=;
}
else return;
}
inline int del(int x)//这里删除的时候,仅仅是赋了一个极大值,塞到堆最靠下的位置啦~
{
int i=pos[x];
a[x]=1e12;
while (i*<=lheap)
{
int p=i*;
if ( a[ heap[p+] ]<a[ heap[p] ] ) p++;
if ( a[ heap[p] ]<a[ heap[i] ] )
{
swap(heap[i],heap[p]);
swap(pos[ heap[i] ],pos[ heap[p] ]);
i=p;
}
else break;
}
}
inline int pop()
{
int i=,rt=heap[];
heap[]=heap[lheap--];
pos[ heap[] ]=;
while (i*<=lheap)
{
int p=i*;
if ( a[ heap[p+] ]<a[ heap[p] ] ) p++;
if ( a[ heap[p] ]<a[ heap[i] ] )
{
swap(heap[i],heap[p]);
swap(pos[ heap[i] ],pos[ heap[p] ]);
i=p;
}
else return rt;
}
return rt;
}
int main()
{
int i,j,k;
cin>>n>>K>>dis[];
a[]=a[n]=1e12;//边界赋一个极大值...(因为a[]中是n-1个数,后边界显然是n)
point[][]=,point[][]=,point[n][]=n,point[n][]=n-;//题解中有解释...
push(),push(n);
for (i=;i<n;i++)
{
scanf("%d",&dis[i+]);
a[i]=dis[i+]-dis[i];
point[i][]=i-;
point[i][]=i+;
push(i);
} for (la=n;K;K--)
{
ans+=a[now=pop()];//pop完了后,要先push,因为堆是在不断扩展的,pop后那个元素依然在heap
prev=point[now][],next=point[now][]; //数组的最后一个,push后可以把它覆盖
a[++la]=a[prev]+a[next]-a[now]; point[la][]=point[prev][];
point[ point[prev][] ][]=la;
point[la][]=point[next][];
point[ point[next][] ][]=la; push(la);//push要在del之前,
del( prev ),del( next );
}
cout<<ans<<endl;
}

题解 P3620 【[APIO/CTSC 2007]数据备份】的更多相关文章

  1. 洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心)

    洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/132 ...

  2. P3620 [APIO/CTSC 2007]数据备份

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

  3. 洛谷 P3620 [APIO/CTSC 2007]数据备份 解题报告

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

  4. 题解:[APIO/CTSC 2007]数据备份

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

  5. 洛谷P3620 [APIO/CTSC 2007] 数据备份 [堆,贪心,差分]

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

  6. P3620 [APIO/CTSC 2007]数据备份[优先队列+贪心]

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

  7. 洛谷P3620 [APIO/CTSC 2007] 数据备份

    题目 贪心+堆. 一般贪心题用到堆的时候都会存在一种反悔操作,因此这个题也不例外. 首先电缆一定是连接两个相邻的点的,这很好证明,其次一个点只能被一条电缆连接,所以我们通过选这个电缆,不选相邻电缆和选 ...

  8. luogu P3620 [APIO/CTSC 2007]数据备份

    luogu 首先如果一条线不是了连接的相邻两个位置一定不优,把它拆成若干连接相邻位置的线.所以现在问题是有\(n\)个物品,选\(k\)个,要求选的位置不能相邻,求最小总和 如果没有选的位置不能相邻这 ...

  9. 洛谷$P3620\ [APIO/CTSC 2007]$数据备份 贪心

    正解:贪心 解题报告: 传送门$QwQ$ $umm$感觉这种问题还蛮经典的,,,就选了某个就不能选另一个这样儿,就可以用堆模拟反悔操作 举个$eg$,如果提出了$a_i$,那就$a_{i-1}$和$a ...

  10. [luogu3620][APIO/CTSC 2007]数据备份【贪心+堆+链表】

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

随机推荐

  1. 物联网架构成长之路(36)-Vue前端入门

    1. 前言 物联网平台,需要有一个类似大屏看板的功能. 找了一圈,发现阿里已经有对应的DataV产品,但是那个价格有点贵啊.所以找了这个[http://datav.jiaminghi.com/demo ...

  2. C# 5.0 新特性之异步方法(AM)

    Ø  前言 C# Asynchronous Programming(异步编程)有几种实现方式,其中 Asynchronous Method(异步方法)就是其中的一种.异步方法是 C#5.0 才有的新特 ...

  3. 抓包工具 fidder4

    抓包工具 fidder4 fidder4是一款基于windos灵活的抓包工具,可抓取pc端移动端的网络数据包. 安装 安装:fidder 4  下载:https://www.telerik.com/d ...

  4. Filebeat和pipleline processor-不部署logstash,实现对数据的处理

    利用ingest node所提供的Pipeline帮我们对数据进行处理. 在Elasticsearch中的配置文件elasticsearch.yml文件中配置:node.ingest: true in ...

  5. string 字符串 的一些使用方法

    Java语言中,把字符串作为对象来处理,类String就可以用来表示字符串(类名首字母都是大写的). 字符串常量是用双引号括住的一串字符. 例如:"Hello World" Str ...

  6. python 父类方法中使用不同的子类中的不同类对象

    # coding:utf-8 class Animal(object): def __init__(self): self._name = None self._f = None def eat(se ...

  7. .NET Core 收徒,有缘者,可破瓶颈

    最近感悟天命,偶有所得,故而打算收徒若干,以继吾之传承. 有缘者,可破瓶颈,职场巅峰指日可待. 入门基本要求: 1.工作经验:1年或以上. 2.拜师费用:3999元(RMB). 传承说明: 1.收徒人 ...

  8. win10自动休眠解决方法

    win10使用外接显示器时,总是过2分钟自动睡眠. 这是系统无人值守时睡眠时间的设定,默认是两分钟. 解决方法: 1.运行注册表管理器,win+r ,输入regedit.exe 2.定位到HKEY_L ...

  9. ** PC端完美兼容各种分辨率的简便方法 **

    原文链接:https://blog.csdn.net/qq_43156398/article/details/102785370 PS:此方法需使用到less或者scss的@变量来支持 以设计图 19 ...

  10. js 加密混淆工具

    访问路径:https://www.sojson.com/javascriptobfuscator.html