UVA 10881 Piotr's Ants -

本文介绍了一个经典的编程竞赛题目——蚂蚁赛跑问题的解决方案。通过将蚂蚁视为不可区分的小点并利用排序技巧,文章详细解释了如何确定任意时刻蚂蚁的位置和方向,同时保持其初始相对顺序不变。提供了完整的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目地址:http://vjudge.net/problem/UVA-10881

思路来自刘汝佳

从远远地看,蚂蚁掉头可以看成蚂蚁互相穿过,没有回头

所以把蚂蚁看成没有意义的小点,那么所有蚂蚁的位置都能确定了

还要知道哪一只蚂蚁是哪一只:

因为蚂蚁的相对位置是不变的,所以可以根据一开始的顺序判断位置变了之后的蚂蚁的序号

至于之后蚂蚁的方向同上述方法一样


流程:

1 走之前 蚂蚁位置从小到大排序,记下蚂蚁的顺序(该蚂蚁的序号就是结果蚂蚁的序号)

2计算T s后的蚂蚁的位置

3排序走之后蚂蚁的序号,此时蚂蚁的序号就是一开始蚂蚁的序号

4处理结果,因为是要按照input顺序


#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn=10000+5;
struct Ant
{
	int p,t,idx; //position,toward,idx
	bool operator < (const Ant& ant) const {
		return p>ant.p;
	}
}before[maxn],after[maxn];
int order[maxn];
const char dir[][11]={"L","Turning","R"};
int main(int argc, char const *argv[])
{
	int N,kase=0,p,n,T,L; char t;
	cin>>N;
	while(N--){

		cin>>L>>T>>n;
		for(int i=0;i<n;i++){
			scanf("%d %c",&p,&t);
			before[i]=Ant{p,t=='R'?1:-1,i};
			after[i]=Ant{p+(t=='R'?1:-1)*T,t=='R'?1:-1,0};
		}

		sort(before,before+n);
		
		for(int i=0;i<n;i++)
			order[before[i].idx]=i;
		
		sort(after,after+n);

		for(int i=0;i<n-1;i++)
			if(after[i].p==after[i+1].p) after[i].t=after[i+1].t=0;

		printf("Case #%d:\n", ++kase);
		for(int i=0;i<n;i++){
			int d=order[i];
			if(after[d].p>L||after[d].p<0) printf("Fell off\n");
			else printf("%d %s\n", after[d].p,dir[after[d].t+1]);
		}
		cout<<endl;
	}
	return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值