洛谷 P3076 [USACO13FEB]出租车Taxi

题目:

长度为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 查看本文章

A c c e p t e d   c o d e : Accepted\ code:

#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;
}

猜你喜欢

转载自blog.csdn.net/qq_39798042/article/details/89380777