UVA 10881 Piotr's Ants

分析:根据题意,每两只蚂蚁相遇后就会各自调头,那么蚂蚁的位置排序是不变的;

什么意思呢?例如一排蚂蚁编号1-5,无论怎样运动,改变的只是位置(相遇后会调头),但第一个位置仍然是1号蚂蚁,最后一个位置仍然是5号蚂蚁。

注意题目给的数据位置并不是从大到小的,所以要按照位置的先后将蚂蚁排一次序;

想象一下,如果两只蚂蚁相遇后会调头和近似的看做两只蚂蚁对穿而过是不是一样的?

给出数据:1号蚂蚁在6向右,二号蚂蚁在3向左,3号蚂蚁在8向左;

根据位置排序后如下图:


现在的蚂蚁位置从左到右是2,1,3

2秒后计算出三个位置,分别是:位置1向右运动,位置 6向左运动 ,位置8向右运动;


位置从左到右不变,给三个位置加上编号:

注意定义结构体时要保存输入的顺序,因为按照位置排序后次序与原来的输入次序不一样

而答案需按照输入的顺序输出,所以一切确定后还要按照输入的顺序排一次序,按输入的次序输出答案


代码:

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int M=10005;
struct ant{
	int id,pos,op,fin;
}s[M];
int x[M];
struct lin{
	int x;
	int y;
}l[M];
bool cmp(const ant&a,const ant&b){
	return a.id<b.id;
}
bool cmp1(const ant&a,const ant&b){
	return a.pos<b.pos;
}
bool cmp2(const lin&a,const lin&b){
	return a.x<b.x;
}
int main(){
	int i,t;
	cin>>t;
	for(int i=1;i<=t;i++){
		memset(x,0,sizeof(x));
		int L,T,n;
		char c;
		cin>>L>>T>>n;
		for(int q=0;q<n;q++){
			cin>>s[q].pos;
			cin>>c;
			if(c=='R')s[q].op=1;
			else s[q].op=-1;
			s[q].id=q;
			l[q].x=s[q].pos+T*s[q].op;
			l[q].y=s[q].op;
		}
		
		sort(s,s+n,cmp1);
		sort(l,l+n,cmp2);
	
		
		for(int q=0;q<n;q++){
			if(l[q].x<0||l[q].x>L)s[q].fin=0;
			else if(q==0&&l[q].x==l[q+1].x)s[q].fin=1;
			else if(q!=0&&(l[q].x==l[q-1].x||l[q].x==l[q+1].x))s[q].fin=1;
			else s[q].fin=2;
			s[q].pos=l[q].x;
			s[q].op=l[q].y;
		} 
		
		sort(s,s+n,cmp);
		cout<<"Case #"<<i<<":"<<endl;
		for(int q=0;q<n;q++){
			if(s[q].fin==0)cout<<"Fell off"<<endl;
			else if(s[q].fin==2){
				cout<<s[q].pos<<" ";
				if(s[q].op==1)cout<<"R"<<endl;
				else cout<<"L"<<endl;
			}
			else if(s[q].fin==1)cout<<s[q].pos<<" "<<"Turning"<<endl;
		}
		cout<<endl;
	}
	return 0;
}



转载于:https://www.cnblogs.com/zhizhaozhuo/p/9594239.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值