【JZOJ3187】的士【模拟】

本文介绍了一种通过适当安排奶牛接送顺序以最小化驾驶距离的方法。问题要求计算Bessie如何有效接送奶牛从起点到终点,并确保总行驶距离最短。解决方案包括将起点和终点分别排序并两两配对。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:

题目链接:https://jzoj.net/senior/#main/show/3187
Bessie为农场上的其他奶牛提供的士服务。奶牛们在一条长为 M M M的栅栏的不同位置上。不幸的是,它们厌倦了它们现在所在的位置而想要去栅栏上其他的位置。Bessie必须把她每一个朋友从它们各自的起始地接上车然后送它们到目的地。但Bessie的车太小了,所以她每次只能运送一只奶牛。奶牛们上车下车是瞬间的事情。
为了省油钱,Bessie想要使她的驾驶量最小。给出 N N N只奶牛每一只的起始地和目的地,计算Bessie最少需要的驾驶量。Bessie意识到她需要偶尔把牛放在某一个地方而不是把它送到目的地才能省油钱。
Bessie在栅栏最左端(位置0)开始工作,而且必须在最右端(位置 M M M)结束她的工作。


思路:

显然无论怎样在中途放下牛来接另外一头牛是不会导致答案更优的。
对于每头牛的起点和终点,中间的路是肯定要走的。
接下来的问题就是当Bessie送完一头牛之后,要到另外一头牛的起点。我们要安排适当的接送顺序使得这些路程尽量小。
于是可以按照起点和终点分别排序,然后两两配对。也就是说,对于排过序的起点终点数组 a , b a,b a,b,我们让Bessie到达 b i b_i bi之后去 a i a_i ai接下一头牛。
同时,可以把点0看成终点,点 m m m看成起点一起排序。相当于从点0出发,到点 m m m结束。


代码:

#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;

const int N=100010;
int n,m,a[N],b[N];
ll ans;

int main()
{
	scanf("%d%d",&n,&m);
	for (int i=1;i<=n;i++)
	{
		scanf("%d%d",&a[i],&b[i]);
		ans+=(ll)abs(a[i]-b[i]);  //中间的距离先加上
	}
	a[++n]=m; b[n]=0;
	sort(a+1,a+n+1);
	sort(b+1,b+n+1);  //排序
	for (int i=1;i<=n;i++)
		ans+=(ll)abs(a[i]-b[i]);  //两两配对
	printf("%lld",ans);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值