因为每次只能载一头牛,所以总路程=每头牛的距离+回头路的最短距离,于是问题变成了如何求回头路的最短距离
我们可以把起点和终点存在两个数组里,然后将两个数组排序后取对应位置相减的绝对值就是每次走回头路的最短距离。然后鬼畜的地方来了,Bessie的起点和终点是特殊的,我们要将她的起点放入终点的数组,终点放入起点的数组。
你问为什么Bessie的要特殊考虑么?我太蒻了,我也不知道啊=。=
网上的题解并没有任何一个严谨地说明了为什么要把Bessie的起点和终点特殊处理,然后USACO的官方题解并没有看懂,所以哪位路过的大佬如果明白为什么麻烦回复一下蒟蒻啊QAQ
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N=100005; 6 long long a[N],b[N]; 7 long long n,m,cnt,ans; 8 long long abso(long long x) 9 { 10 return x>0?x:-x; 11 } 12 int main() 13 { 14 scanf("%lld%lld",&n,&m); 15 for(int i=1;i<=n;i++) 16 { 17 scanf("%lld%lld",&a[i],&b[i]); 18 ans+=abso(b[i]-a[i]); 19 } 20 a[n+1]=m,b[n+1]=0; 21 sort(a+1,a+1+n+1),sort(b+1,b+1+n+1); 22 for(int i=1;i<=n+1;i++) 23 ans+=abso(a[i]-b[i]); 24 printf("%lld",ans); 25 return 0; 26 }