蚂蚁(离散化+排序+模拟)


Problem Link:http://139.129.36.234/problem.php?id=1277


1277: 蚂蚁

时间限制: 1 Sec   内存限制: 128 MB
提交: 4   解决: 4
[ 提交][ 状态][ 讨论版]

题目描述

一根长度为L厘米的木棍上面有n只蚂蚁,每只蚂蚁要么朝左爬,要么朝右爬,速度为1厘米/秒.当两支蚂蚁想撞时,二者同时掉头(掉头时间忽略不计)。给出每只蚂蚁的初始位置和朝向,计算T秒之后蚂蚁的位置。

输入

输入的第一行为数据组数。每组数据的第一行为3个正整数L,T,n(0<=n<10000);以下n行每行描述一只蚂蚁的初始位置,其中,整数x为蚂蚁距离木棍左端的距离(单位:厘米),字母表示初始朝向(L表示朝左,R表示朝右)。

输出

对于每组数据,输出n行,按照输入顺序输出每只蚂蚁的位置和朝向(Turning表示正在碰撞)。在T秒之前已经掉下木棍的蚂蚁(正好爬到木棍边缘的不算)输出Fell off。

样例输入

2
10 1 4
1 R
5 R
3 L
10 R
10 2 3
4 R
5 L
8 R

样例输出

Case #1:
2 Turning
6 R
2 Turning
Fell off

Case#2:
3 L
6 R
10 R

提示

来源


AC code:

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<map>
#include<math.h>
#include<string.h>
#include<queue>
#include<vector>
#include<set>
#define LL long long
#define exp 1e-9
#define MAXN 1000010

using namespace std;

struct node{
	int p;
	int d;
	int id;
}Ant1[10010],Ant2[10010];

bool cmp(node a,node b)
{
	return a.p<b.p;
}

char dir[][11]={"L","Turning","R"};

int firstID[10010];

int main()
{
//	freopen("D:\\in.txt","r",stdin);  
    int k,cas,i,L,T,n,x,d,id;
    char ch;
    scanf("%d",&cas);
    for(k=1;k<=cas;k++)
    {
    	scanf("%d%d%d",&L,&T,&n);
    	for(i=0;i<n;i++)
    	{
    		scanf("%d %c",&x,&ch);
    		d=(ch=='L'? -1: 1);
    		Ant1[i].d=d;
    		Ant1[i].id=i;
    		Ant1[i].p=x;
    		
    		Ant2[i].d=d;
    		Ant2[i].id=0;
    		Ant2[i].p=x+T*d;
		}
		sort(Ant1,Ant1+n,cmp);
		for(i=0;i<n;i++)
		{
			firstID[Ant1[i].id]=i;
		}
		
		sort(Ant2,Ant2+n,cmp);
		for(i=0;i<n-1;i++)
		{
			if(Ant2[i].p==Ant2[i+1].p)
			{
				Ant2[i].d=Ant2[i+1].d=0;
			}
		}
		printf("Case #%d:\n",k);
		for(i=0;i<n;i++)
		{
			id=firstID[i];
			if(Ant2[id].p<0||Ant2[id].p>L)
			{
				printf("Fell off\n");
			}
			else
			{
				printf("%d %s\n",Ant2[id].p,dir[Ant2[id].d+1]);
			}
		}
		printf("\n");
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林下的码路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值