思维题 飞行器
链接:https://ac.nowcoder.com/acm/contest/1168/F
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
空间限制: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
说明
对于第二个样例:
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\n"); break; } if(d[i]==0){ tx=0; }else if(d[i]==1){ ty=0; } } if(flag==0){ printf("YES\n"); } } return 0; }