[jzoj 3187] 的士 {贪心}

版权声明:~~~感谢支持! https://blog.csdn.net/qq_39897867/article/details/88915307

题目

Description

Bessie为农场上的其他奶牛提供的士服务。奶牛们在一条长为M(1<=M<=1,000,000,000)的栅栏的不同位置上。不幸的是,它们厌倦了它们现在所在的位置而想要去栅栏上其他的位置。Bessie必须把她每一个朋友从它们各自的起始地接上车然后送它们到目的地。但Bessie的车太小了,所以她每次只能运送一只奶牛。奶牛们上车下车是瞬间的事情。

为了省油钱,Bessie想要使她的驾驶量最小。给出N只奶牛(1<=N<=100,000)每一只的起始地和目的地,计算Bessie最少需要的驾驶量。Bessie意识到她需要偶尔把牛放在某一个地方而不是把它送到目的地才能省油钱。

Bessie在栅栏最左端(位置0)开始工作,而且必须在最右端(位置M)结束她的工作。

Input

第一行输入正整数N,M

接下来N行,每行包括两个整数s_i,t_i(0<=s_i,t_i<=M),表示第i只奶牛的起始地和目的地。

Output

输出一行,Bessie最少需要的驾驶量。(注意最终结果可能会超出32位整数)


解题思路

显然,每一段的距离是一定要走的,对于每两段之间的距离排一个序直接枚举计算。


代码

#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std; 
ll n,m,a[100010],b[100010],ans; 
int main(){
	scanf("%lld%lld",&n,&m); 
	for (ll i=1;i<=n;i++) scanf("%lld%lld",&a[i],&b[i]),ans+=abs(a[i]-b[i]); 
	a[++n]=m; b[n]=0; 
	sort(a+1,a+n+1),sort(b+1,b+n+1); 
	for (ll i=1;i<=n;i++) ans+=abs(a[i]-b[i]); 
	printf("%lld",ans); 
}

猜你喜欢

转载自blog.csdn.net/qq_39897867/article/details/88915307
今日推荐