题目描述
在二维坐标系里,有N个金币,编号0至N-1。初始时,第i个金币的坐标是(Xi,Yi)。所有的金币每秒向下垂直下降一个单位高度,例如有个金币当前坐标是(xf, yf),那么t秒后金币所在的位置就是(xf, yf-t)。初始时,FJ在(0,0)坐标处,FJ每秒只能向左移动一个单位距离或者向右移动一个单位距离,当然FJ也可以不移动。如果在某个时刻某个金币和FJ所在的位置重合,那么FJ就能接住这个金币。FJ能否把所有的金币都接住?如果行输出Abletocatch,否则输出Notabletocatch。
输入输出格式
输入格式:
多组测试数据。
第一行,一个整数G,表示有G组测试数据。1 <= G <= 5。
每组测试数据格式如下:
第一行,一个整数N。 1 <= N <= 50。
接下来有N行,第i行两个整数表示Xi、Yi。
-1000<=Xi<=1000。0<=Yi<=1000。
输出格式:
共G行,每行输出Abletocatch或Notabletocatch。
输入输出样例
输入样例#1: 复制
5
3
-1 1
1 3
0 4
1
-3 2
3
-1 1
1 2
0 4
3
0 9
-1 1
1 3
8
70 141
-108 299
52 402
-70 280
84 28
-29 363
66 427
-33 232
思路:数学+模拟
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int T,n,flag; int x[55],y[55]; int main(){ scanf("%d",&T); while(T--){ scanf("%d",&n); flag=0;x[0]=0;y[0]=0; for(int i=1;i<=n;i++) scanf("%d%d",&x[i],&y[i]); for(int i=0;i<=n;i++){ for(int j=i+1;j<=n;j++){ if(abs(x[i]-x[j])>abs(y[i]-y[j])){ cout<<"Notabletocatch"<<endl; flag=1;break; } } if(flag) break; } if(flag) continue; else cout<<"Abletocatch"<<endl; } }