[POI2017] Flappy Bird 解题报告

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33468963/article/details/62468489

题目: http://www.gdfzoj.com/oj/problem/469

在游戏中,小鸟一开始位于(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)飞到目的地最少需要点击多少次屏幕。
如果无论如何都飞不到目的地,输出NIE,否则输出点击屏幕的最少次数。

数据范围:0<=n<=500000 1<=X<=10^9
显然枚举每一个横坐标是会TLE的,只能枚举每一个柱子,然后修改到达x[i]时能达到的最大最小值
而且从坐标 (x[i],y) 到横坐标 x[i+1] 的最大最小值 为(y+x[i+1]-x[i]) ,(y-x[i+1]+x[i])
至于输出答案,可以发现 到达坐标 (x,y) 所需点击次数一定是 (x+y) / 2

代码:(就是一道数学题

#include <cstdio>
#define f(x) ((x&1) ? x+1 : x+2)

int N,X,x[500000],a[500000],b[500000],max,min,last,i;

int main() {
    scanf("%d%d",&N,&X);
    for (i=1;i<=N;i++) {
        scanf("%d%d%d",x+i,a+i,b+i);
        min -= x[i] - x[i-1];
        max += x[i] - x[i-1];
        if (min <= a[i]) min += f(a[i] - min);
        if (max >= b[i]) max -= f(max - b[i]);
        if (min > max) {puts("NIE");  return 0;}
    } printf("%d\n",(x[N] + min) / 2);
}

猜你喜欢

转载自blog.csdn.net/qq_33468963/article/details/62468489