• [POI2017] Flappy Bird


    问题描述

    《飞扬的小鸟》是一款风靡的小游戏。在游戏中,小鸟一开始位于(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<=X<=10^9)。

    接下来n行,每行三个整数x[i],a[i],b[i] (0<x[i]<X,-109<=a[i]<b[i]<=109)。 数据保证x[i]<x[i+1]。

    输出格式

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

    解析

    假设我们已经确定了在跨过每一个障碍物时的高度,分别记为(h_1,h_2,h_3,......,h_n),再记第i与i-1个障碍物之间点的次数为(x_i),没点的次数为(y_i),那么我们有

    [x_i+y_i=dis_i-dis_{i-1}\x_i-y_i=h_i-h_{i-1} ]

    通过解方程我们得到

    [x_i=frac{dis_i-dis_{i-1}+h_i-h_{i-1}}{2} ]

    将所有(x_i)相加得到的就是我们的答案,为

    [sum_{i=1}^{n}x_i=frac{dis_n+h_n}{2} ]

    所以,我们只需要使到达最后的障碍物时的高度最小即可。那么接下来的问题是如何保证过程合法。我们可以通过递推的方式,得到经过每个障碍时的高度上下界,看过程中是否出现不合法的情况即可。

    关于上下界的递推,还有一个需要注意的地方。如果我们一直向下,可能会低于障碍的下界,那么我们就需要点几下回到下界。但是每点一次,最终的高度就会上升2,所以还要考虑一下一直向下得到的高度与(a[i]+1)的差值的奇偶性才能得到正确的下界。上界也是同样的道理。

    代码

    #include <iostream>
    #include <cstdio>
    #define N 500002
    using namespace std;
    int n,d,i,x[N],a[N],b[N],down,up;
    int read()
    {
    	char c=getchar();
    	int w=0,f=1;
    	while(c<'0'||c>'9'){
    		if(c=='-') f=-1;
    		c=getchar();
    	}
    	while(c<='9'&&c>='0'){
    		w=w*10+c-'0';
    		c=getchar();
    	}
    	return w*f;
    }
    int main()
    {
    	n=read();d=read();
    	for(i=1;i<=n;i++) x[i]=read(),a[i]=read(),b[i]=read();
    	for(i=1;i<=n;i++){
    		int dis=x[i]-x[i-1];
    		if(down-dis>=a[i]+1) down-=dis;
    		else{
    			if((a[i]+1-down+dis)%2==0) down=a[i]+1;
    			else down=a[i]+2;
    		}
    		if(up+dis<=b[i]-1) up+=dis;
    		else{
    			if((up+dis-b[i]+1)%2==0) up=b[i]-1;
    			else up=b[i]-2;
    		}
    		if(down>up){
    			puts("NIE");
    			return 0;
    		}
    	}
    	int ans=(x[n]+down)/2;
    	printf("%d
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    android的快速开发框架集合
    总结防止APK被工具反编译、二次打包等
    iOS开发笔记--应用跳转
    iOS开发笔记--iOS沙盒机制
    iOS开发笔记--43个在GitHub上的优秀Swift开源项目推荐
    iOS开发笔记--iOS App图标和启动画面尺寸
    iOS开发笔记--iOS国际化与NSLocalizedString的使用
    iOS开发笔记--ios 画图总结
    iOS开发笔记--iOS中的触摸事件和手势处理
    iOS开发笔记--iOS中的多线程
  • 原文地址:https://www.cnblogs.com/LSlzf/p/11804660.html
Copyright © 2020-2023  润新知