东北育才 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; }