傻鸡抓螃蟹

题目描述
背景
又到了吃大闸蟹的季节,黄老师想吃大闸蟹,于是叫傻鸡去抓大闸蟹~
描述
现有 n 只大闸蟹,每个在一个二维坐标上,保证没有任何两个大闸蟹重合。傻鸡伸手抓大
闸蟹了,他怕大闸蟹的攻击,当他捉一只大闸蟹时,其他大闸蟹都朝这只运动(左边的向右,
右边的向左,x 坐标相同的不动)。
当然,大闸蟹只会在 x方向上横行,每秒一单位长度。傻鸡捉一只大闸蟹一秒钟,当本秒
末若某一只大闸蟹与傻鸡的手同 x 坐标,傻鸡的行动失败。问:怎样做才能抓完 n 只大闸
蟹?
输入
输入格式
输入
第一行:n。
第二行有 2n 正整数,相邻两个用一空格分开,第 2i-1 和第 2*i 个数表示编号为 i 的大闸
蟹的 x,y 作标。
输入保证按先 x 后 y 的递增序排列。
输出
输出格式
输出:
一共 n 行,每行一个大闸蟹编号,表示傻鸡取大闸蟹的先后序列。如有多解,输出第一个
编号最小的,如果第一个编号相同,输出第二个编号最大的,再相同,输出第三个编号最
小的…
样例输入
2
1 3 4 2
样例输出
1
2
提示
限制
每个测试点一秒
提示
输入数据保证有解
n<=5000.
0<=所有坐标<=2^31-1

题解:
证明:
因为输入数据保证有解,假设有两只螃蟹 a,b 初始横坐标为 x1,x2 且 x2-x1=1,则在任
意时刻 a,b 都将向同一方向运动,即永远不能抓 a 和 b,与题意不符。
那么有没有可能两只螃蟹在中途走到一起?设 x2-x1=2,由上面的证明 x1+1 的位置
上无螃蟹,即 x1,x2 不能向对方移动。
因此任何一只螃蟹在任何时刻都能被抓到。证毕。
方案:从两头向中间输出即可。
就是在头上抓一个,在相应的另一边抓一个,这样中间的螃蟹就左走,后右走,相当于不变。

题目本质上竟然这么简单…然而我想不到555

#include<iostream>//傻鸡抓螃蟹 
#include<algorithm>
using namespace std;
struct crab{
	int num;
	int x;
	int y;
}c[5010];
bool Rule(crab c1,crab c2){
		return c1.x<c2.x;
}
int main(){
	int n;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>c[i].x>>c[i].y;
		c[i].num=i+1;
    }
	sort(c,c+n,Rule);
	for(int i=0;i<n;i++){
		if(!i%2)
			cout<<c[i].num<<endl;
		else
			cout<<c[n-i].num<<endl;
    }
 	cout<<endl;
	return 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值