[CTSC2007][APIO2007]数据备份Backup

题目:BZOJ1150、codevs1615、洛谷P3620

题目大意:有n个点,k条链,每个点离原点有一定的距离。要你用k条链连接2k个点,使得k条链的长度最短。

解题思路:毕竟是CTSC级别的题目,很难找出正确算法。在网上翻阅了很多资料后,终于理解了此题的正确算法。orz

正确算法为:贪心+链表+堆。

首先每次肯定是链相邻的2个点,所以我们先把相邻2个点的差值求出来,得到有n-1个数的数列。

然后问题就变成“在这个数列中寻找k个互不相邻的点,使得它们的和最小”。

我们把所有的数扔进一个堆里,每次贪心找出最小的数,在答案里把它加上。

这时就会出现一个问题:假设我们贪心出了第i个数,那么有可能选第i-1个数和第i+1个数最终的结果优于选第i个数。

所以我们每次贪心时,把找到的那个数的前一个数和后一个数删掉,把“前一个数+后一个数-原数”的值扔进堆里,如果这个数被选,相当于选了前一个数和后一个数而不选原数。

而链表记录的是每个数的前一个和后一个。详见代码第32~35行。

在删数时,并不需要在堆里找到这个数,只需把它的值改为inf就行了。详见代码第36行。

C++ Code:

#include<cstdio>
#include<ext/pb_ds/priority_queue.hpp>
const int inf=int(1000000000*1.3);
using namespace std;
struct shuju{
	int dis,num;
	shuju(int d,int n):dis(d),num(n){}
	bool operator<(const shuju& rhs)const{return dis>rhs.dis;}
};
__gnu_pbds::priority_queue<shuju,less<shuju>,__gnu_pbds::pairing_heap_tag>h;
int n,k,dis[100005],pre[100005],nxt[100005];
int main(){
	scanf("%d%d",&n,&k);
	int x,y;
	scanf("%d",&x);
	for(int i=2;i<=n;i++){
		scanf("%d",&y);
		dis[i]=y-x;x=y;
		h.push(shuju(dis[i],i));
		pre[i]=i-1;nxt[i]=i+1;
	}
	int ans=0;
	pre[2]=nxt[n]=0;
	while(k--){
		while(h.top().dis!=dis[h.top().num])h.pop();
		int k=h.top().num;
		int l=pre[k],r=nxt[k];
		h.pop();
		ans+=dis[k];
		if(l&&r)dis[k]=dis[l]+dis[r]-dis[k];else
		dis[k]=inf;
		pre[nxt[r]]=k;
		nxt[pre[l]]=k;
		nxt[k]=nxt[r];
		pre[k]=pre[l];
		dis[l]=dis[r]=inf;
		h.push(shuju(dis[k],k));
	}
	printf("%d\n",ans);
	return 0;
}

  

时间: 2024-10-10 13:46:11

[CTSC2007][APIO2007]数据备份Backup的相关文章

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

1150: [CTSC2007]数据备份Backup Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1136  Solved: 458[Submit][Status][Discuss] Description Input 输入的第一行包含整数n和k,其中n(2 ≤ n ≤100 000)表示办公楼的数目,k(1≤ k≤ n/2)表示可利用的网络电缆的数目.接下来的n行每行仅包含一个整数(0≤ s ≤1000 000 000), 表示每个办公楼到大

【BZOJ 1150】 1150: [CTSC2007]数据备份Backup (贪心+优先队列)

1150: [CTSC2007]数据备份Backup Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏的乐趣.已知办公 楼都位于同一条街上.你决定给这些办公楼配对(两个一组).每一对办公楼可以通过在这两个建筑物之间铺设网 络电缆使得它们可以互相备份.然而,网络电缆的费用很高.当地电信公司仅能为你提供 K 条网络电缆,这意味 着你仅

1150: [CTSC2007]数据备份Backup

1150: [CTSC2007]数据备份Backup https://lydsy.com/JudgeOnline/problem.php?id=1150 分析: 堆+贪心. 每次选最小的并一定是最优的,如果不选这个最小的,那一定是为了取它左右两边(两条都要取才可能比当前优). 如果先选了最小的,考虑后面如何撤销.选了这个后,左右两边的线段就要删了,那么在加入一个长度为:左边的长度+右边的长度-当前的线段的长度 的一条线段. wqs二分,模拟费用流 代码: 1 #include<cstdio>

【bzoj1150】[CTSC2007]数据备份Backup 模拟费用流+链表+堆

题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏的乐趣.已知办公楼都位于同一条街上.你决定给这些办公楼配对(两个一组).每一对办公楼可以通过在这两个建筑物之间铺设网络电缆使得它们可以互相备份.然而,网络电缆的费用很高.当地电信公司仅能为你提供 K 条网络电缆,这意味着你仅能为 K 对办公楼(或总计2K个办公楼)安排备份.任一个办公楼都属于唯一的配

bzoj 1150: [CTSC2007]数据备份Backup

Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏的乐趣.已知办公 楼都位于同一条街上.你决定给这些办公楼配对(两个一组).每一对办公楼可以通过在这两个建筑物之间铺设网 络电缆使得它们可以互相备份.然而,网络电缆的费用很高.当地电信公司仅能为你提供 K 条网络电缆,这意味 着你仅能为 K 对办公楼(或总计2K个办公楼)安排备份.任一

BZOJ1150 [CTSC2007]数据备份Backup 【堆 + 链表】

题目 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏的乐趣.已知办公 楼都位于同一条街上.你决定给这些办公楼配对(两个一组).每一对办公楼可以通过在这两个建筑物之间铺设网 络电缆使得它们可以互相备份.然而,网络电缆的费用很高.当地电信公司仅能为你提供 K 条网络电缆,这意味 着你仅能为 K 对办公楼(或总计2K个办公楼)安排备份.任一个办公楼都属于唯一

Bzoj1150 数据备份Backup

Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏的乐趣.已知办公 楼都位于同一条街上.你决定给这些办公楼配对(两个一组).每一对办公楼可以通过在这两个建筑物之间铺设网 络电缆使得它们可以互相备份.然而,网络电缆的费用很高.当地电信公司仅能为你提供 K 条网络电缆,这意味 着你仅能为 K 对办公楼(或总计2K个办公楼)安排备份.任一

BZOJ1150 [CTSC2007]数据备份Backup

这是一道很好的题目,正常人都想不出做法. 我还记得题解是说: (1)想到动规,但是T到死... (2)转化成网络流,还是T的不行 (3)咦,好像是贪心欸,做出来了(你在卖萌!) 其实算法很简单,首先我们知道必须找相邻的两个进行配对,但是不是直接找最小,而是每次要找最短的一段(后面会解释什么叫"段"),于是可以用堆来维护. 具体做法是找出当前最短的段X,设左边那段叫L,右边那段叫R,那么: 只要(1)ans += dis[X]  (2)删除X.L.R三段,即堆中删除dis[X], dis

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

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1150 [题目大意] 给出n个数,请你挑出k对(每个数不可重复选取),使得他们差的绝对值之和最小(k小于等于n/2) [题解] 因为数列给出有序,省去排序步骤,我们发现最优答案一定是选择k对相邻的数, 因此我们将相邻的数两两之间求差,得到差分数列, 现在问题转化为在这个新的数列中,选取k个不相邻的数,使得和最小. 我们发现在选取一个数之后,只对左右两边的数有影响, 所以,每当我们选取一