愿各位程序员都能记住,输出第一条hello world时候的心情。坚持下去,你的每一条代码都在默默的改变世界,加油!加油!加油! “这些年我一直提醒自己一件事情,千万不要自己感动自己。大部分人看似的努力,不过是愚蠢导致的。 什么熬夜看书到天亮,连续几天只睡几小时,多久没放假了,如果这些东西也值得夸耀,那么富士康流水线上任何一个人都比你努力多了。 人难免天生有自怜的情绪,唯有时刻保持清醒,才能看清真正的价值在哪里。

[Usaco2013 Feb]Taxi

 

本人水平有限,题解不到为处,请多多谅解

 

本蒟蒻谢谢大家观看

 

题目:传送门

 

题目翻译如下


贝西(Bessie)正在为农场的其他奶牛提供出租车服务。奶牛
沿着长度为M(1 <= M <= 1,000,000,000)的栅栏聚集在不同的位置。不幸的是,他们对
当前的位置感到厌烦,每个人都希望沿着篱笆走到其他地方。贝茜必须
在起跑点接她的每个朋友,然后开车送他们到目的地。贝茜的车很小,
所以一次只能运送一头母牛。奶牛可以立即进出汽车。
为了节省汽油,贝茜想尽量减少开车的次数。给定
N头奶牛中每头奶牛的开始和结束位置(1 <= N <= 100,000),请确定Bessie驾驶的最少驾驶量
去做。贝西意识到要节省最多的汽油,她可能偶尔需要将母牛放下到
目的地以外的其他地方。Bessie从栅栏的最左点开始,位置0,
并且必须在栅栏的最右点,位置M处完成旅程
。Bessie开出租车接人。整条路长度为M(1 <= M <= 10 ^ 9)。Bessie一开始在0号站,有N家客户(1 <= N <= 10 ^ 5)想要坐车,
它们会告诉Bessie这些在哪里以及它们的目的地。而Bessie的车太小了,一次只能坐一头牛。
为了省油,Bessie发现它每次不见得要把客户直接放在它的目的地,可以在中途放下之后再来接。
最后Bessie想问,它从0号站出发,接完所有的客户,最后到达M号站最少要走多少站?

输入项

*第1行:N和M以空格分隔。
*第2..1 + N行:第(i + 1)行包含两个以空格分隔的整数s_i和t_i(0 <= s_i,t_i <= M),
指示第i头母牛的起始位置和目的地位置。

输出量

第1行:一个整数,指示Bessie必须完成的驾驶总量。请注意,结果可能不适合32位整数。

样本输入

2 10
0 9
6 5
输入详细信息:有两头母牛等待沿着长度为10的围栏运输。
第一头母牛要从位置0(贝西开始的位置)移到位置9。
 第二头母牛希望从位置6转到位置5。

样本输出

12
输出详细信息:Bessie在位置0捡起第一头母牛,然后驱动到位置6。
她在那里放下第一头母牛,将第二头母牛运送到目的地,然后返回
捡起第一头牛。她放下第一头母牛,然后开车驶向其余的路
在栅栏的右边。
在0号站接第1个客户,从0号站出发到6号站(7站),放下第1个客户,接第2个客户,即可5号站再回来(2站),再接第1个客户,到达9号点(3站),共12站。(因为送完所有客户之后Bessie已在终点,故无需再走)


此题的贪心策略值得一思
首先我们可以肯定s_i 到 t_i 这段距离我们无论如何必须走到
接下来是考虑如何走回头路的问题
由图可知:回头路最小值应为不是同一对终点与起点的最小距离

 


再看一幅图:

 

黑色为必经之路,红色为贪心策略之最短路,我们可以发现最初0与最末m也构成起点与终点,只不过样例中0已经为一头奶牛的起点,已经被算过了
反观回头路6,5在第一次中为第二头奶牛的初末点,在之后,我们以5为起点找到的最近的终点为6(或以6为终点找最近的起点),将5→6作为回头路


注意:应当把0和m也放进起点与终点,在进行快排来确定最短距离


 code:

 1 #include<bits/stdc++.h>
 2 #define int long long
 3 using namespace std;
 4 int n,m;
 5 int s[100010],t[100010];
 6 int ans=0;
 7 inline int read(){
 8     int x=0,f=1;char ch=getchar();
 9     while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();};
10     while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
11     return x*f;
12 }
13 signed main(){
14     n=read(),m=read();
15     for(int i=1;i<=n;i++){
16         s[i]=read(),t[i]=read();
17         ans+=abs(s[i]-t[i]);
18     }
19     s[n+1]=m,t[n+1]=0;
20     sort(s+1,s+n+2);
21     sort(t+1,t+n+2);
22     for(int i=1;i<=n+1;i++){
23         ans+=abs(s[i]-t[i]);
24     }
25     printf("%lld\n",ans);
26     return 0;
27 } 
28 /*
29 2 10
30 0 9
31 6 5
32 */

 

 








posted @ 2019-10-16 16:25  max_lemon  阅读(284)  评论(4编辑  收藏  举报
Live2D
别人恋爱不成功,你连暗恋都不成功! 你写不出代码的原因只有一个,那就是你没有彻底理解这个算法的思想!!-----沃茨·基硕德