zoukankan      html  css  js  c++  java
  • [思维]Flappy Bird

    题目描述

    《飞扬的小鸟》是一款风靡的小游戏。在游戏中,小鸟一开始位于(0,0)处,它的目标是飞到横坐标为X的某个位置上。每一秒,你可以选择点击屏幕,那么小鸟会从(x,y)飞到(x+1,y+1),或者不点击,那么小鸟会飞到(x+1,y-1)。在游戏中还有n个障碍物,用三元组(x[i],a[i],b[i])描述,表示在直线x=x[i]上,y<=a[i]或者y>=b[i]的部分都是障碍物,碰到或者擦边都算游戏失败。请求出小鸟从(0,0)飞到目的地最少需要点击多少次屏幕。

    输入

    第一行包含两个整数n(0<=n<=500000),X(1<=n<=10^9)。
    接下来n行,每行三个整数x[i],a[i],b[i](0<x[i]<X,-10^9<=a[i]<b[i]<=10^9)。
    数据保证x[i]<x[i+1]。

    输出

    如果无论如何都飞不到目的地,输出NIE,否则输出点击屏幕的最少次数。
     

    样例输入

    4 11
    4 1 4
    7 -1 2
    8 -1 3
    9 0 2
    

    样例输出

    5
    

    提示

    思路:

    从图中可以看出,从(0,0)出发,飞到直线x=xi上时,当xi为奇数,到达的点只可能是(xi,-3/-1/1/3/5/...),当xi为偶数时,到达的点只可能是(xi,-4/-2/0/2/4/6/...);因此,对每一个障碍物,维护其可以通过的最高点和最低点。

    AC代码:

    #include <iostream>
    #include<cstdio>
    #include<algorithm>
    typedef long long ll;
    using namespace std;
    
    ll x[500005],a[500005],b[500005];
    
    int main()
    {
        ll n,X;scanf("%lld%lld",&n,&X);
        for(ll i=1;i<=n;i++){
            scanf("%lld%lld%lld",&x[i],&a[i],&b[i]);
            a[i]++;
            b[i]--;
        }
        ll u=0,d=0;
        for(ll i=1;i<=n;i++){
            ll dis=x[i]-x[i-1];
            u=min(u+dis,b[i]);
            d=max(d-dis,a[i]);
            if((u&1)!=(x[i]&1)) u--;
            if((d&1)!=(x[i]&1)) d++;
            if(u<d) {printf("NIE
    "); return 0;}
        }
        printf("%lld
    ",x[n]-(x[n]-d)/2);
        return 0;
    }
    转载请注明出处:https://www.cnblogs.com/lllxq/
  • 相关阅读:
    BZOJ2303:[APIO2011]方格染色(并查集)
    BZOJ1116:[POI2008]CLO(并查集)
    BZOJ4011:[HNOI2015]落忆枫音(DP,拓扑排序)
    洛谷1387 最大正方形
    洛谷 P1858 多人背包
    vijos 1085 Sunnypig闯三角关
    vijos 1030 重叠的方框
    codevs 1001 舒适的路线 WK
    1266. [NOIP2012] 借教室
    codevs 2370 小机房的树
  • 原文地址:https://www.cnblogs.com/lllxq/p/10110969.html
Copyright © 2011-2022 走看看