bzoj3062[Usaco2013 Feb]Taxi*
Posted YuanZiming
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj3062[Usaco2013 Feb]Taxi*相关的知识,希望对你有一定的参考价值。
题意:
Bessie在农场上为其他奶牛提供出租车服务,她必须赶到这些奶牛的起始位置,并把他们带到它们的目的地。Bessie的车很小,所以她只能一次只能搭载一头奶牛。N只奶牛的起始位置和结束为止都是已知的,请确定Bessie从0点出发完成任务再到m点的最少行程。Bessie意识到,要使所得到的行程最短,Bessie可能将在沿途中让奶牛上车或下车而并不一定将一头奶牛从起点直接送到终点。n≤100000,m≤1000000000。
题解:
神贪心……首先每只奶牛从起点到终点的这段路程是不可避免的,所以先将它们计入答案,之后的目标是尽量减少空车的时间。接着会发现最优策略应该是载着某牛的过程中刚好遇到要坐车的奶牛,就把当前奶牛放下载这只,载完后再回到此地(此过程即是我们要最小化的“空车”阶段)接之前被放下的奶牛(注意在此过程中有可能出现多只奶牛被放下的情况)。故在起点数组里加入m,终点数组里加入0,对它们排序,接着答案依次累加abs(a[i]-b[i])。
代码:
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <queue> 5 #define inc(i,j,k) for(int i=j;i<=k;i++) 6 #define maxn 100010 7 using namespace std; 8 9 inline int read(){ 10 char ch=getchar(); int f=1,x=0; 11 while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1; ch=getchar();} 12 while(ch>=‘0‘&&ch<=‘9‘)x=x*10+ch-‘0‘,ch=getchar(); 13 return f*x; 14 } 15 int n,m,a[maxn],b[maxn]; long long ans; 16 int main(){ 17 n=read(); m=read(); inc(i,1,n)a[i]=read(),b[i]=read(); inc(i,1,n)ans+=abs(a[i]-b[i]); 18 a[++n]=m; b[n]=0; sort(a+1,a+n+1); sort(b+1,b+n+1); inc(i,1,n)ans+=abs(a[i]-b[i]); 19 printf("%lld",ans); return 0; 20 }
20161023
以上是关于bzoj3062[Usaco2013 Feb]Taxi*的主要内容,如果未能解决你的问题,请参考以下文章
[BZOJ2591][Usaco 2012 Feb]Nearby Cows
bzoj3940 [Usaco2015 Feb]Censoring
BZOJ 1651: [Usaco2006 Feb]Stall Reservations 专用牛棚
bzoj3940[Usaco2015 Feb]Censoring*