东北育才 d1t4 漂流

漂流

flow.cpp

题目描述

暑期将至,小鼠Jack决定到鼠国最著名的蓝阴河去玩漂流。

我们假定蓝阴河宽度为m米,其中每隔一定距离就会有一处障碍(为了让漂流更刺激~),一共有n个障碍,第i个障碍的Xi-Yi米处是一个开口,只有从障碍中间的开口处才能通过(开口包含Xi,Yi)。现在Jack位于1号障碍的开口处,他要划艇依次通过这些障碍,但是Jack比较懒,每当他向左或向右移动1米,他就会消耗1点体力。由于水流的作用,Jack向前移动不消耗体力。现在,他希望知道,他依次通过这些障碍所需要消耗的最小体力是多少。

 

输入格式

第一行2个整数:n,m。

下面n行每行2个整数:Xi,Yi。(保证X1=Y1)

 

输出格式

第一行1个整数,代表答案。

样例输入1

样例输出1

3 6

1 1

3 5

2 4

2

样例输入2

样例输出2

4 6

4 4

5 6

1 1

3 4

7

 

 

 

 

 

 

 

 

 

 

 

 

 

 

样例解释

样例1:(1,1)->(2,3)->(3,3)消耗体力为2+0=2

样例2:(1,4)->(2,5)->(3,1)->(4,3)消耗体力为1+4+2=7

数据范围

对于20%的数据,2≤n,m≤100

对于50%的数据,2≤n,m≤1000

对于80%的数据,2≤n,m≤10^5

对于100%的数据,2≤n≤10^5,1≤Xi≤Yi≤m≤10^9

 

 

 

这道题题解给的特别迷,但其实非常简单。

直接贪心,没次如果能走就直接往下走,如果不能走找到最近的口走。

正确性:这样走有可能更好不可能更坏,所以贪心得证

但是数据没有保证X1=Y1,标解直接用X1可A,用Y1不可A。

但我们可以把X1到Y1每个点都跑一边找出最小的,复杂度不会超,也更稳妥

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
int main()
{
    ll i,j;
    ll n;
    ll m;
    scanf("%lld%lld",&n,&m);
    ll sum=0;
    ll x,y;
    scanf("%lld%lld",&x,&y);
    ll start=x;
    ll min1,max1;
    for(i=2;i<=n;i++)
    {
        scanf("%lld%lld",&x,&y);
        int a=min(x,y);
        int b=max(x,y);
        if(start>=a&&start<=b)
        {
            continue;
        }
        else
        if(start<x&&start<y)
        {
            int l=min(x,y);
            sum=sum+l-start;
            start=l;
        }
        else
        if(start>x&&start>y)
        {
            int p=max(x,y);
            sum=sum+start-p;
            start=p;
        }
    }
    cout<<sum;
}
View Code

 

posted @ 2017-07-14 10:04  ashon37w  阅读(238)  评论(1编辑  收藏  举报