Piotr's Ants

题意:

一个水平面,给出n只蚂蚁的速度和方向,求一定时间后各蚂蚁的位置和方向

思路:

蚂蚁相撞后是会掉头的,所以从始至终他们相对的大概位置不会变,那么一开始排在前面的蚂蚁如果没掉下去还是在前面,turing表示正在碰撞,所以用一个order数组存第i号蚂蚁在第几位,最后用after存蚂蚁运动后的状态,由于排过序,所以下标就是第几位,最后依据order逐号求出蚂蚁的状态。

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int l, t, n;
struct node {
	int id;
	int pos;
	int dir;
	bool operator < (const node& a)const {
		return pos < a.pos;
	}

} before[10005], after[10005];
int order[10005];
char dirname[][10] = {"L", "Turning", "R"};
int main() {
	int cas;
	int tcase = 0;
	scanf("%d", &cas);
	while(cas--) {
		int p, d;
		char c;
		printf("Case #%d:\n",++tcase);
		scanf("%d%d%d", &l, &t, &n)
       for(int i=0; i<n; i++)
         {
             int  p, d;
             char c;
             scanf("%d %c",&p,&c);
             d=(c=='L'?-1:1);
             before[i]=(node){i,p,d};
             after[i]=(node){0,p+t*d,d};  //所有的蚂蚁相撞后可以看做对穿而过
         }
       sort(before,before+n);
         for(int i=0; i<n; i++)  //最巧妙的地方在这里,第一次从左到右所有的蚂蚁的相对位置没有变化
             order[before[i].id]=i;
         sort(after,after+n);
         for(int i=0; i<n-1; i++)
             if(after[i].pos==after[i+1].pos)  after[i].dir=after[i+1].dir=0;
		for(int i=0; i<n; i++) {
			int t = order[i];
			if(after[t].pos <= l && after[t].pos>=0) {
				printf("%d %s\n", after[t].pos, dirname[after[t].dir+1]);  
			}
			else printf("Fell off\n");
		}
		printf("\n");
	}
	return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值