UVA - 10881 Piotr's Ants(思维题)

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

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

Output

对于每组数据,输出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

思路:蚂蚁的碰撞可以当作对穿而过,所以蚂蚁的位移等于路程。又因为蚂蚁的相对位置不会改变,比如第一位的蚂蚁,在T时间后,它依然是在第一。他们的相对排法不会改变。

#include<algorithm>
#include<string.h>
#include<stdio.h>
#define M 10010
using namespace std;
int v,l,t,m;
struct ant
{
    int id,p,f;
    int operator < (ant a)
    {
        return p<a.p;
    }
}befor[M],after[M];
int mark[M];
char str[][10]={"L","Turning","R"};
int main()
{
    scanf("%d",&v);
    int ph=1;
    while(v--)
    {
        scanf("%d%d%d",&l,&t,&m);
        for(int i=1;i<=m;i++)
        {
            int p,d;
            char c;
            scanf("%d %c",&p,&c);
            d=(c=='L'?-1:1);
            befor[i]=(ant){i,p,d};
            after[i]=(ant){i,p+t*d,d};
        }
        sort(befor+1,befor+m+1);
        for(int i=1;i<=m;i++)
            mark[befor[i].id]=i;
        sort(after+1,after+m+1);
        for(int i=2;i<=m;i++)
        {
            if(after[i].p==after[i-1].p)
                after[i].f=after[i-1].f=0;
        }
        printf("Case #%d:\n",ph++);
        for(int i=1;i<=m;i++)
        {
            int pi=mark[i];
            if(after[pi].p>=0&&after[pi].p<=l)
            {
                printf("%d %s\n",after[pi].p,str[after[pi].f+1]);
            }
            else
                printf("Fell off\n");
        }
        printf("\n");
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_41380961/article/details/81053678