《飞扬的小鸟》是一款风靡的小游戏。在游戏中,小鸟一开始位于(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)飞到目的地最少需要点击多少次屏幕。
标签:printf one class nbsp closed 飞扬 hid load content
注意,这小鸟可以“打洞”,就是说,高度变成负数也是合法的!
那么,只要我们通过了最后的一个障碍物,就一定可以不用进行任何点击地飞到目的地。
相邻两个障碍物之间的横坐标之差就是这一段距离中最大的上升(或下降)高度,就可以计算出飞到下一个障碍物处可以到达的区间范围,再用障碍物的要求卡一下即可。
1 #include <bits/stdc++.h> 2 const int maxn = 500005; 3 int n, x[maxn], a[maxn], b[maxn], A, B; 4 int main(){ 5 scanf("%d%*d", &n); 6 for (int i = 1; i <= n; ++i) 7 scanf("%d%d%d", x + i, a + i, b + i); 8 for (int i = 1; i <= n; ++i) { 9 int tmp = x[i] - x[i - 1]; 10 A = std::max(A - tmp, a[i] + 1); 11 B = std::min(B + tmp, b[i] - 1); 12 if ((A & 1) != (x[i] & 1))A = A + 1; 13 if ((B & 1) != (x[i] & 1))B = B - 1; 14 if (A > B)return puts("NIE"), 0; 15 } 16 printf("%d\n", (A + x[n]) >> 1); 17 }
@Author: YouSiki
BZOJ 4723: [POI2017]Flappy Bird
标签:printf one class nbsp closed 飞扬 hid load content
原文地址:http://www.cnblogs.com/yousiki/p/6106684.html