【洛谷】P2694 接金币(排序)

题目描述

在二维坐标系里,有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\n");
33                 flag=true;
34                 break;
35             }
36         }
37         if(!flag) printf("Abletocatch\n");
38     }
39     return 0;
40 }

 

posted @ 2017-10-16 12:30  noble_(noblex)  阅读(334)  评论(0编辑  收藏  举报
/* */