[Usaco2013 Feb]Taxi

来源:互联网 发布:阿里云搭建wordpress 编辑:程序博客网 时间:2024/06/05 02:00

Description
Bessie is running a taxi service for the other cows on the farm. The cows have been gathering at different locations along a fence of length M(1<=M<=1,000,000,000). Unfortunately, they have grown bored with their current locations and each wish to go somewhere else along the fence. Bessie must pick up each of her friends at their starting positions and drive them to their destinations. Bessie’s car is small so she can only transport one cow in her car at a time. Cows can enter and exit the car instantaneously. To save gas, Bessie would like to minimize the amount she has to drive. Given the starting and ending positions of each of the N cows (1<=N<=100,000), determine the least amount of driving Bessie has to do. Bessie realizes that to save the most gas she may need to occasionally drop a cow off at a position other than her destination. Bessie starts at the leftmost point of the fence, position 0, and must finish her journey at the rightmost point on the fence, position M.
Bessie在农场上为其他奶牛提供出租车服务。这些奶牛已经在沿着长度为M(1<=M<=1,000,000,000)的栅栏上不同的地点聚集等候。不幸的是,他们已经厌倦了他们当前所在的位置并且每只奶牛都想要沿着栅栏去别的地方走走。 Bessie必须赶到这些奶牛的起始位置,并把他们带到它们的目的地。Bessie的车很小,所以她只能一次只能搭载一头奶牛。奶牛可以在同一时刻完成上车和下车。
为了节省燃气,Bessie想以尽可能少的燃料完成这次任务。N只奶牛的起始位置和结束为止都是已知的(1<=N<=100000),请确定Bessie的最少行程。Bessie意识到,要使所得到的行程最短,Bessie可能将在沿途中让奶牛上车或下车而并不一定将一头奶牛从起点直接送到中点。
Bessie的起点是围栏的最左端,位置记为0。终点在篱笆的最右边,位置记为M

Input
Line 1: N and M separated by a space.
Lines 2..1+N: The (i+1)th line contains two space separated integers,si and ti(0<=si,ti<=M), indicating the starting position and destination position of the ith cow.

Output
Line 1: A single integer indicating the total amount of driving Bessie must do. Note that the result may not fit into a 32 bit integer.

Sample Input
2 10
0 9
6 5

INPUT DETAILS
There are two cows waiting to be transported along a fence of length 10. The first cow wants to go from position 0 (where Bessie starts) to position 9. The second cow wishes to go from position 6 to position 5.

Sample Output
12

OUTPUT DETAILS
Bessie picks up the first cow at position 0 and drives to position 6. There she drops off the first cow, delivers the second cow to her destination and returns to pick up the first cow. She drops off the first cow and then drives the remainder of the way to the right side of the fence.

HINT
在0号站接第1个客户,从0号站出发到6号站(7站),放下第1个客户,接第2个客户,送到5号站再回来(2站),再接第1个客户,送到9号点(3站),共12站。(因为送完所有客户之后Bessie已在终点,故无需再走)

Source
Gold

思路
总共要走的路程=必须要走的路程+空车路程,必须要走的路程已经确定了,关键就是空车的路程。
而空车的路程总是从一个终点走到另一个起点,毕竟在一个站点抛下一头牛比在一个不是站点的地方抛下一头牛要更优。
所以这个问题就变成了如何行驶使得路程最短而且每一路段都经过了有且仅有一遍。
这样看上去多像欧拉路啊。
事实上这就是欧拉回路,先读入每一路段,再加上一段从m到0的路(为了便于构造欧拉回路)。
然后计算出所有要走的路程,再将起点升序排序,终点升序排序,最后将排序后的对应起点和终点相减的绝对值计入答案。
这样做的原因是:顺序和>乱序和>反序和,那么顺序和<乱序和<反序和,那么可以保证总共要走的路程最短。
这样就完美的解决了。

代码

#include <cstdio>#include <cmath>#include <algorithm>const int maxn=100000;int n,m,s[maxn+10],t[maxn+10];long long ans;const bool cmp(int a,int b){    return a>b;}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;}
原创粉丝点击