题目描述
在二维坐标系里,有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
输出样例#1:
Abletocatch Notabletocatch Notabletocatch Abletocatch Notabletocatch
--------------------------------------------------------------------
分析:日常切水题。以y为标准从大到小排序,那么只要前后两个x之差的绝对值大于y之差的绝对值,那么FJ就来不及跑到那里,Notabletocatch。否则Abletocatch。
1 #include <cstdio> 2 #include <cmath> 3 #include <algorithm> 4 using namespace std; 5 struct coins 6 { 7 int x,y; 8 }a[100000]; 9 bool cmp(coins a,coins b) 10 { 11 if(a.y<=b.y) return true; 12 return false; 13 } 14 int main() 15 { 16 int g,n; 17 scanf("%d",&g); 18 while(g--) 19 { 20 bool flag=false; 21 scanf("%d",&n); 22 a[0].x=a[0].y=0;n++; 23 for(int i=1;i<n;i++) 24 { 25 scanf("%d%d",&a[i].x,&a[i].y); 26 } 27 sort(a,a+n,cmp); 28 for(int i=0;i<n-1;i++) 29 { 30 if(abs(a[i].x-a[i+1].x)>abs(a[i+1].y-a[i].y)) 31 { 32 printf("Notabletocatch "); 33 flag=true; 34 break; 35 } 36 } 37 if(!flag) printf("Abletocatch "); 38 } 39 return 0; 40 }