UVA-10881 - Piotr's Ants

Piotr‘s Ants

Time Limit: 2 seconds

"One thing is for certain: there is no stopping them;

the ants will soon be here. And I, for one, welcome our

new insect overlords."

Kent Brockman

Piotr likes playing with ants. He has n of them on a horizontalpoleL cm long. Each ant is facing either left or right and walksat a constant speed of 1 cm/s. When two ants bump into each other, theyboth
turn around (instantaneously) and start walking in opposite directions.Piotr knows where each of the ants starts and which direction it is facingand wants to calculate where the ants will end upT seconds from now.

Input

The first line of input gives the number of cases, N. Ntest cases follow. Each one starts with a line containing 3 integers:L ,T andn
(0 <= n <= 10000).The nextn lines give the locations of then ants (measuredin cm from the left end of the pole) and the direction they are facing(L or R).

Output

For each test case, output one line containing "Case #x:"followed byn lines describing the locations and directions of then ants in the same format and order as in the input. If two or moreants are at the same
location, print "Turning" instead of "L" or "R" fortheir direction. If an ant falls off the polebefore
T seconds,print "Fell off" for that ant. Print an empty line after each test case.

Sample Input Sample Output
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

这个问题真的不简单啊,貌似挑战上也有这个例子,首先输入的顺序不是特定的,所以要从左到右编号,中间碰撞虽然可以视为相互穿过,但是相对位置是不变的,与初始顺序一样的。

,,,其实理解了order数组的作用就很简单了

开始输入的第i只蚂蚁,是从左边数第order[i]个,所以我们后面操作的是order数组,即按照相对顺序排列的

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 10005;
struct ant
{
    int id;//输入顺序
    int p;//位置
    int d;//方向
    bool operator < (const ant & a){
        return p < a.p;
    }
}before[N],after[N];
int order[N];
const char dir[][10] = {"L","Turning","R"};

int main()
{
    int tt;
    cin >> tt;
    for(int ca = 1;ca <= tt;ca++)
    {
        int l,t,n;
        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] = (ant){i,p,d};//学到了
            after[i] = (ant){0,p+t*d,d};
        }
        //计算order数组
        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].p == after[i+1].p)
                after[i].d = after[i+1].d = 0;

        //输出
        printf("Case #%d:\n",ca);
        for(int i = 0;i < n;i++)
        {
            int a = order[i];
            if(after[a].p <0 || after[a].p>l)
                printf("Fell off\n");
            else
                printf("%d %s\n",after[a].p,dir[after[a].d+1]);
        }
        printf("\n");
    }
    return 0;
}

UVA-10881 - Piotr's Ants

时间: 2024-10-27 01:12:17

UVA-10881 - Piotr's Ants的相关文章

uva 10881 Piotr&#39;s Ants 解题报告

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=20&page=show_problem&problem=1822 题目意思:有一条 L 厘米长的杆,上面有 n 只蚂蚁,给出每只蚂蚁的朝向以及离杆上最左端的距离,问 T 秒之后每只蚂蚁到达的位置,如果 T 秒后某个位置有多只蚂蚁同时到达,那么这堆蚂蚁处于的位置 + Turning,如果超过这条杆的长度,输出F

UVa 10881 Piotr&#39;s Ants (等价变换)

题意:一个长度为L的木棍上有n个蚂蚁,每只蚂蚁要么向左,要么向右,速度为1,当两只蚂蚁相撞时, 它们同时掉头.给定每只蚂蚁初始位置和朝向,问T秒后,每只蚂蚁的状态. 析:刚看到这个题时,一点思路也没有,怎么做啊,难道又要模拟么,一想,模拟...天呐,好麻烦! 最终还是看了一下题解.真是很巧妙哪. 首先是当两个蚂蚁相撞时,转向和不转向是看不出来的.也就是说掉头等价于对穿而过.也就是说, 如果把蚂蚁看成是没有区别的小点,那么只要独立算每只蚂蚁的位置即可.虽然是这么说,但是, 对每只蚂蚁却不是这样,但

uva 10881 Piotr&#39;s Ants (模拟)

uva 10881 Piotr's Ants "One thing is for certain: there is no stopping them; the ants will soon be here. And I, for one, welcome our new insect overlords."Kent Brockman Piotr likes playing with ants. He has n of them on a horizontal pole L cm lo

UVA 10881 - Piotr&#39;s Ants【模拟+思维】

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1822 题意:有很多只蚂蚁在一条直线上,每个蚂蚁移动速度都是1,并且有一个初始方向.并且当相邻两个蚂蚁相撞时转向.现在问t时间后各个蚂蚁的位置. 解法:这题的一个致命技巧就是把两只蚂蚁的相撞看作是两只蚂蚁交换穿过对方并且交换蚂蚁的编号.这个是很好理解的,类似于物理的完全弹性碰撞.又由

UVA 10881 Piotr&#39;s Ants(模拟)

题目链接:https://vjudge.net/problem/UVA-10881 其实这道题的关键只有一句话: 当两个蚂蚁因碰撞而掉头的时候,我们完全可以认为是两个点对穿而过. 这时候我们的主要任务就是弄清楚“谁是谁”. 然而很明显每只蚂蚁的相对顺序是不变的,所以我们要记录一个$order$数组. 预处理出它的初始状态和order,同时算出走之后的状态. 注意程序中的有些地方处理的很巧妙. AC代码: 1 #include<cstdio> 2 #include<iostream>

【UVA】10881-Piotr&#39;s Ants

记得之前做过一个类似的,这里的话蚂蚁碰见掉头和碰见穿过去起始本质上都是一样的,只不过相撞之后蚂蚁对应的ID换了. 有了思路就很好模拟了. 14058049 10881 Piotr's Ants Accepted C++ 0.052 2014-08-18 03:53:00 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<vector>

【UVa 10881】Piotr&#39;s Ants

Piotr's Ants Porsition:Uva 10881 白书P9 中文改编题:[T^T][FJUT]第二届新生赛真S题地震了 "One thing is for certain: there is no stopping them;the ants will soon be here. And I, for one, welcome our new insect overlords."Kent Brockman Piotr likes playing with ants. H

UVA10881 Piotr&#39;s Ants

Piotr's AntsTime Limit: 2 seconds "One thing is for certain: there is no stopping them;the ants will soon be here. And I, for one, welcome ournew insect overlords." Kent Brockman Piotr likes playing with ants. He has n of them on a horizontalpol

UVa10881 Piotr&#39;s Ants (思维)

链接:http://acm.hust.edu.cn/vjudge/problem/25979分析:n只蚂蚁在爬,将n只蚂蚁距离木棍左端的距离从小到大排序后它们的相对顺序是不变的,因为碰到另一只蚂蚁两只蚂蚁就会掉头,蚂蚁就像一个弹珠来回弹,但整体上“掉头”等价于“对穿而过”,但题目要求输入时的顺序输出,所以并不是所有蚂蚁都是一样的,还要认清谁是谁,所以如果蚂蚁1初始状态为(3,R)两秒后在(5,R)的位置会出现一只蚂蚁但不一定是蚂蚁1,但是可以肯定(5,R)位置上的蚂蚁相对于其它蚂蚁的顺序和初始状