问题 B: 傻鸡抓大闸蟹
时间限制: 1 Sec 内存限制: 128 MB提交: 94 解决: 39
[提交] [状态] [命题人:jsu_admin]
题目描述
背景
又到了吃大闸蟹的季节,黄老师想吃大闸蟹,于是叫傻鸡去抓大闸蟹~
描述
现有n只大闸蟹,每个在一个二维坐标上,保证没有任何两个大闸蟹重合。傻鸡伸手抓大闸蟹了,他怕大闸蟹的攻击,当他捉一只大闸蟹时,其他大闸蟹都朝这只运动(左边的向右,右边的向左,x坐标相同的不动)。
当然,大闸蟹只会在x方向上横行,每秒一单位长度。傻鸡捉一只大闸蟹一秒钟,当本秒末若某一只大闸蟹与傻鸡的手同x坐标,傻鸡的行动失败。问:怎样做才能抓完n只大闸蟹?
又到了吃大闸蟹的季节,黄老师想吃大闸蟹,于是叫傻鸡去抓大闸蟹~
描述
现有n只大闸蟹,每个在一个二维坐标上,保证没有任何两个大闸蟹重合。傻鸡伸手抓大闸蟹了,他怕大闸蟹的攻击,当他捉一只大闸蟹时,其他大闸蟹都朝这只运动(左边的向右,右边的向左,x坐标相同的不动)。
当然,大闸蟹只会在x方向上横行,每秒一单位长度。傻鸡捉一只大闸蟹一秒钟,当本秒末若某一只大闸蟹与傻鸡的手同x坐标,傻鸡的行动失败。问:怎样做才能抓完n只大闸蟹?
输入
第一行:n。n<=5000.
第二行有2*n正整数,相邻两个用一空格分开,第2*i-1和第2*i个数表示编号为i的大闸蟹的x,y坐标。0<=所有坐标<=2^31-1
输入保证按先x后y的递增序排列。
第二行有2*n正整数,相邻两个用一空格分开,第2*i-1和第2*i个数表示编号为i的大闸蟹的x,y坐标。0<=所有坐标<=2^31-1
输入保证按先x后y的递增序排列。
输出
一共n行,每行一个大闸蟹编号,表示傻鸡取大闸蟹的先后序列。如有多解,输出第一个编号最小的,如果第一个编号相同,输出第二个编号最大的,再相同,输出第三个编号最小的......
输入数据保证有解
输入数据保证有解
样例输入 Copy
2
1 3 4 2
样例输出 Copy
1
2
题解
本题读懂了就会发现很水,没读懂就会无从下手。 证明:
因为输入数据保证有解,假设有两只螃蟹 a,b 初始横坐标为 x1,x2 且 x2-x1=1,则在任
意时刻 a,b 都将向同一方向运动,即永远不能抓 a 和 b,与题意不符。
那么有没有可能两只螃蟹在中途走到一起?设 x2-x1=2,由上面的证明 x1+1 的位置 上无螃蟹,即 x1,x2 不能向对方移动。
因此任何一只螃蟹在任何时刻都能被抓到。证毕。 方案:从两头向中间输出即可
就是在头上抓一个,在相应的另一边抓一个,这样中间的螃蟹就左走,后右走,相当 于不变
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include<stdio.h> 2 int main(){ 3 int n; 4 scanf("%d",&n); 5 int a[5010]; 6 int b[5010]; 7 for(int i = 1;i<=n;i++) 8 { 9 scanf("%d",&a[i]); 10 scanf("%d",&b[i]); 11 } 12 int k = 1; 13 int h = n; 14 for(int i =1;i<=n;i++) 15 { 16 if(i%2!=0) 17 printf("%d\n",k++); 18 else 19 printf("%d\n",h--); 20 } 21 // printf("%d",i) 22 }