zoukankan      html  css  js  c++  java
  • [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
    ",ans);
    26     return 0;
    27 } 
    28 /*
    29 2 10
    30 0 9
    31 6 5
    32 */







  • 相关阅读:
    字典的操作用法小总结
    HTTP Headers解析
    RStdio常用快捷键
    R语言数据类型
    数据科学实战手册(R+Python)书中引用资料网址
    ggplot2使用初探
    urllib2使用初探
    R语言以及RStdio的安装
    目标检测--Selective Search for Object Recognition(IJCV, 2013)
    关于Python的lambda
  • 原文地址:https://www.cnblogs.com/nlyzl/p/11686315.html
Copyright © 2011-2022 走看看