1. 程式人生 > >Flappy Bird

Flappy Bird

問題 A: Flappy Bird

時間限制: 1 Sec  記憶體限制: 128 MB
提交: 404  解決: 72
[提交] [狀態] [討論版] [命題人:admin]

題目描述

《飛揚的小鳥》是一款風靡的小遊戲。在遊戲中,小鳥一開始位於(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

 

提示

題意

  中文題意,不做解釋。

分析

  1、這個鳥要從(0,0)到(x,y)不管怎麼飛必須要點選(x+y)/2次

  2、對於同一列的障礙物,鳥可以計算出來一個能飛到的最高點和最低點。

  3、一直遞推到最後,利用1推出的結論求出點選次數即可。

///  author:Kissheart  ///
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
#include<vector>
#include
<stdlib.h> #include<math.h> #include<queue> #include<deque> #include<ctype.h> #include<map> #include<set> #include<stack> #include<string> #define INF 0x3f3f3f3f #define FAST_IO ios::sync_with_stdio(false) const double PI = acos(-1.0); const double eps = 1e-6; const int MAX=5e5+10; const int mod=1e9+7; typedef long long ll; using namespace std; #define gcd(a,b) __gcd(a,b) inline ll lcm(ll a,ll b){return a/gcd(a,b)*b;} inline ll qpow(ll a,ll b){ll r=1,t=a; while(b){if(b&1)r=(r*t)%mod;b>>=1;t=(t*t)%mod;}return r;} inline ll inv1(ll b){return qpow(b,mod-2);} inline ll exgcd(ll a,ll b,ll &x,ll &y){if(!b){x=1;y=0;return a;}ll r=exgcd(b,a%b,y,x);y-=(a/b)*x;return r;} inline ll read(){ll x=0,f=1;char c=getchar();for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;for(;isdigit(c);c=getchar()) x=x*10+c-'0';return x*f;} //freopen( "in.txt" , "r" , stdin ); //freopen( "data.txt" , "w" , stdout ); ll n,X; ll x[MAX],a[MAX],b[MAX]; int main() { scanf("%lld%lld",&n,&X); for(ll i=1;i<=n;i++) scanf("%lld%lld%lld",&x[i],&a[i],&b[i]); ll t,maxn=0,minn=0,last=0,p; for(ll i=1;i<=n;i++) { t=x[i]-last; maxn=maxn+t; minn=minn-t; if(minn<=a[i]) { p=a[i]-minn; if(p%2) p+=1; else p+=2; minn=minn+p; } if(maxn>=b[i]) { p=maxn-b[i]; if(p%2) p+=1; else p+=2; maxn=maxn-p; } //printf("%lld %lld\n",minn,maxn); if(maxn<minn) { printf("NIE\n"); return 0; } last=x[i]; } printf("%lld\n",(minn+x[n])/2); return 0; }
View Code