zoukankan      html  css  js  c++  java
  • [POI2017] Flappy Bird (思维题)

    题目

    Problem Description

    《飞扬的小鸟》是一款风靡的小游戏。在游戏中,小鸟一开始位于(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)飞到目的地最少需要点击多少次屏幕。

    Input

    第一行包含两个整数n((0<=n<=500000)),X((1<=n<=109))
    接下来n行,每行三个整数x[i],a[i],b[i]((0<x_i<X,−10^9<=a_i<b_i<=10^9))
    数据保证(x_i<x_{i+1})

    Output

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

    Sample Input

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

    Sample Output

    5

    分析

    • 我们注意到,从起点到某一个点,不用管怎么飞,它要“点击”次数是固定的(设是从(0,0)到 (x,y)那么就需要点击 (frac{y+x}{2}) 次),于是,我们就可以对于每一个水管来更新一下鸟在这所能到达的一个区间(程序中为 [L,R],意思是在 x=lx 这时,鸟能到达 [L,R] 这些高度的地方,其中 lx 是上一个管道的横坐标)。
    • 由于目的地保证在最后一个水管之后,所以答案就是到达最终 L 所在的地方需要点击的次数。
    • 不过还有一点要注意,就是注意到对于每个横坐标 x,鸟所能到的纵坐标奇偶性 必须与 x 相同,所以特判一下就行了。
    • 给张图,可能容易理解一点(这里面蓝线与x轴夹角都是45度,红点代表这个横坐标鸟能到的区间)
      这里写图片描述

    程序

    #include <cstdio>
    #include <algorithm>
    #define del (x-lx)
    using namespace std;
    int n,x,lx,l,r,L,R,ll,rr;
    
    int main(){
    	freopen("1.txt","r",stdin);
    	scanf("%d%d",&n,&x);
    	for (int i=1; i<=n; i++){
    		scanf("%d%d%d",&x,&l,&r);
    		ll=L-del, rr=R+del;
    		l+=((x&1)==(l&1) ? 2:1);	//由于给的柱子相对于鸟所能到的地方为闭区间
    		r-=((x&1)==(r&1) ? 2:1);	//所以处理一下,顺便把奇偶性统一了
    		L=max(l,ll);
    		R=min(r,rr);
    		if (L>R){puts("NIE"); return 0;}
    		lx=x;
    	}
    	printf("%d",L+lx>>1);
    }
    
  • 相关阅读:
    select 1
    使用Word2016发布CSDN博客
    使用word 2013 发布csdn博客
    使用word写CSDN博客文章
    用Word 写csdn blog
    如何使用office2016发布CSDN博客
    用word发CSDN blog
    使用word文档直接发表博客 8 )
    将Word发布到博客园
    Word 2010发布博客文章(修正)
  • 原文地址:https://www.cnblogs.com/hehepig/p/6685727.html
Copyright © 2011-2022 走看看