zoukankan      html  css  js  c++  java
  • 思维题 飞行器

    链接:https://ac.nowcoder.com/acm/contest/1168/F
    来源:牛客网

    时间限制:C/C++ 1秒,其他语言2秒
    空间限制:C/C++ 262144K,其他语言524288K
    64bit IO Format: %lld

    题目描述


    在复杂的环境下航迹快速规划是智能飞行器的一个重要课题,为了简单起见,飞行器只能在x轴方向或者y轴方向中飞行,且在x轴正方向中每飞行1米则会产生t米的误差(即在x轴上多飞t米),同理在y轴方向中,每飞行1米则会产生t米的误差(即在y轴上多飞t米,多飞的距离不会再次产生误差)因为站台空间有限,当飞行器在x轴平面与y轴平面的误差大于某值时,飞行器将不能安全降落在站台,从而摧毁。(起点的误差为0。x轴,y轴误差极限分别为SX,SY)。

     

           为了解决该问题,欧涛提出在飞行器的路径中分别建立n个点(蓝点或红点),其中蓝点用于将x轴平面误差清零,红点用于将y轴平面误差清零。这样操作,就能解决误差问题。


    输入描述:

    第1行输入一个整数T,表示测试次数。

    每组测试样例的第一行都包含四个整数,分别为t,SX,SY,n。

    每组测试样例的2到2+n-1行,每行三个数ai,bi,d(代表站台坐标(ai,bi),其中d为站台类别,若d为0,则该站台为x轴误差清零点;d为1则为y轴误差清零点)

    (第一个输入的站台为起点,最后输入的站台为终点,站台输入顺序为飞行器经过站台顺序)

    输出描述:

    如果飞行器能正常到达终点,输出“YES”(没有双引号),否则输出“NO”(没有双引号)。
    示例1

    输入

    复制
    3
    1 629 5 6
    20 90 0
    29 39 0
    46 76 0
    52 48 1
    79 37 1
    82 83 0
    
    1 258 650 4
    39 91 1
    52 90 1
    62 33 0
    69 68 0
    
    3 501 449 1
    100 47 1

    输出

    复制
    NO
    YES
    YES

    说明

    对于第二个样例:

    t=1,SX=258,SY=650,n=4

    起点(39,91),此时的x与y的误差都是0

    起点到第二个站台: x轴多飞(52-39)*1米,y轴多飞 -(90-91)*1米,站台类型为1,y轴误差清零

    第二个站台到第三个站台: x轴多飞 (62-52)*1米,y轴多飞 -(33-90)*1米,站台类型为0,x轴误差清零

    第三个站台到第四个站台: x轴多飞 (69-62) *1米,y轴多飞 (68-33)*1米,站台类型为0,x轴误差清零

    因为飞行过程中,x轴与y轴的误差都不大于他的极限(SX或SY),所以可以正常到终点,输出YES

    备注:

    数据范围:

    0< t,SX,SY,n,ai,bi < 666
    细节!!! 题目没说是整数,因此是浮点数;
    题目中的误差是飞机多飞的量,而不是坐标相对的量,因此要求绝对值;
    #include<cstdio>
    #include<cstring>
    #include<algorithm> 
    using namespace std;
    
    int T;
    int t,sx,sy,n,d[1000];
    double a[1000],b[1000];
    
    double s(int a){
        if(a<0){
            return -a;
        }else{
            return a;
        }
    }
    
    int main(){
        scanf("%d",&T);
        while(T--){
            int flag=0;
            scanf("%d%d%d%d",&t,&sx,&sy,&n);
            double tx=0,ty=0;
            for(int i=1;i<=n;i++){
                scanf("%lf%lf%d",&a[i],&b[i],&d[i]);
            }
            for(int i=2;i<=n;i++){
                tx+=s((a[i]-a[i-1])*t);
                ty+=s((b[i]-b[i-1])*t);
                if(tx>sx||ty>sy){
                    flag=1;
                    printf("NO
    ");
                    break;
                }
                if(d[i]==0){
                    tx=0;
                }else if(d[i]==1){
                    ty=0;
                }
            }
            if(flag==0){
                printf("YES
    ");
            }
        }
        return 0;
    } 
  • 相关阅读:
    旅行,写作,编程
    Limu:JavaScript的那些书
    怎样花两年时间去面试一个人
    IE6之各种不适记录
    19位编程大师集锦
    开源中最好的Web开发资源汇总
    流行Linux和Windows脚本语言列表
    近来,一组名为“全球郁闷青年写真”的照片在网上热传...
    浏览器端技术体系概览 前端开发的七种武器
    这个世界从来没有任何一件工作叫“钱多、事少、离家近”
  • 原文地址:https://www.cnblogs.com/qqshiacm/p/11872766.html
Copyright © 2011-2022 走看看