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;
}