题目:
长度为m的栅栏上,有n头牛需要坐车前往别的地方,起点和终点分别为a_i和b_i。现在一辆出租车从最左端0出发,要运送完所有牛,最后到达最右端m,求最小路程。出租车只能一次载一只牛。
解题思路:
1.每个st对应的ed这段路程无论如何都要算上
2.额外还要计算的一段路程,就是“切换”费用
什么是切换费用呢?
我们知道可能会有这样的位置st,到达该位置时,把已经在车上的牛 i 扔下去,载上该处的牛 j 并将它运到其终点ed再回来把牛 i 载上
那么我们就需要再加上每一对abs(ed-st)的和
具体实现,我们需要在st、ed中再加上终点m,起点0,
但是要注意的是,0加到ed里,m加到st里
原因在于我们需要从起点0走到最近的st,从最远的ed走到m
所以0对应的就是min_st,0必然在ed里的第一个;m也一样
最后将st,ed排序,枚举累加即可
扫描二维码关注公众号,回复:
6780754 查看本文章
#include<cstdio>
#include<algorithm>
int n, m;
int s[100005], t[100005];
long long ans;
int main() {
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; ++i) {
scanf("%d %d", &s[i], &t[i]);
ans += abs(t[i] - s[i]);
}
s[n+1] = m;
t[n+1] = 0;
std::sort(s+1, s+n+2);
std::sort(t+1, t+n+2);
for (int i = 1; i <= n + 1; ++i)
ans += abs(t[i] - s[i]);
printf("%lld\n", ans);
return 0;
}