zoukankan      html  css  js  c++  java
  • 【BZOJ4723】[POI2017]Flappy Bird DP

    【BZOJ4723】[POI2017]Flappy Bird

    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<=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]。

    Output

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

    Sample Input

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

    Sample Output

    5

    HINT

    题解:假如终止点一定,那么我们可以O(1)求出需要点的次数,那我们直接求出到达每一个柱子时能达到的范围就好了

    细节不说了,但注意无论怎么点,它都只能飞到x+y为偶数的坐标位置上,判断一下就好了

    #include <cstdio>
    #include <iostream>
    #include <cstring>
    using namespace std;
    const int maxn=500010;
    int x[maxn],a[maxn],b[maxn],l[maxn],r[maxn];
    int n;
    int main()
    {
    	scanf("%d%d",&n,&x[n+1]);
    	x[0]=l[0]=r[0]=0;
    	int i;
    	for(i=1;i<=n;i++)
    	{
    		scanf("%d%d%d",&x[i],&a[i],&b[i]);
    		r[i]=min(b[i]-1,r[i-1]+x[i]-x[i-1]);
    		l[i]=max(a[i]+1,l[i-1]-x[i]+x[i-1]);
    		if((r[i]+x[i])&1)	r[i]--;
    		if((l[i]+x[i])&1)	l[i]++;
    		if(l[i]>r[i])
    		{
    			printf("NIE");
    			return 0;
    		}
    	}
    	printf("%d",l[n]+x[n]>>1);
    	return 0;
    }
  • 相关阅读:
    微信支付v2开发(3) JS API支付
    微信支付v2开发(4) 交易通知
    微信支付v2开发(5) 订单查询
    JavaScript大文件上传解决方案实例代码
    JS大文件上传解决方案实例代码
    VUE大文件上传解决方案实例代码
    HTML大文件上传解决方案实例代码
    Web大文件上传解决方案实例代码
    .net大文件上传解决方案实例代码
    jsp大文件上传解决方案实例代码
  • 原文地址:https://www.cnblogs.com/CQzhangyu/p/6825356.html
Copyright © 2011-2022 走看看