uva 10881 Piotr'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,如果超过这条杆的长度,输出Fell off,其余情况是:蚂蚁位置+朝向

突发奇想,想做下这题,学习了 lrj 写法。

他的before 和 after 处理,使得蚂蚁在杆子上依次从左到右处理,而且这样做的好处是,不需要对当前的蚂蚁T秒后的位置与已经处理的蚂蚁作比较(检查是否有Turning 情况),大大节省了时间,否则有可能是10000 × 10000 呢~~~order 数组则记下原来最开始时蚂蚁的编号,是为了输出按回原输入啦。

好简洁,好好向他学习^_^

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 using namespace std;
 5
 6 const int maxn = 10000 + 5;
 7
 8 struct Ant
 9 {
10     int id;  // 蚂蚁编号
11     int p;   // 蚂蚁位置
12     int d;   // 蚂蚁朝向  左: -1  转向:0 右:1
13     bool operator < (const Ant& a) const
14     {
15         return p < a.p;
16     }
17 }before[maxn], after[maxn];
18
19 int order[maxn];
20 char dirname[][10] = {"L", "Turning", "R"};
21
22 int main()
23 {
24     int N, L, T, n;
25     while (scanf("%d", &N) != EOF)
26     {
27         for (int cas = 1; cas <= N; cas++)
28         {
29             scanf("%d%d%d", &L, &T, &n);
30             int dir;
31             char pos;
32             for (int i = 0; i < n; i++)
33             {
34                 cin >> dir >> pos;
35                 int d = (pos == ‘R‘ ? 1 : -1);
36                 before[i] = (Ant){i, dir, d};
37                 after[i] = (Ant){0, dir+d*T, d};
38             }
39             sort(before, before+n);
40             for (int i = 0; i < n; i++)
41                 order[before[i].id] = i;
42             sort(after, after+n);
43             for (int i = 0; i < n-1; i++)
44             {
45                 if (after[i].p == after[i+1].p)
46                     after[i].d = after[i+1].d = 0;  // 碰撞
47             }
48             printf("Case #%d:\n", cas);
49             for (int i = 0; i < n; i++)
50             {
51                 int a = order[i];
52                 if (after[a].p < 0 || after[a].p > L)
53                     printf("Fell off\n");
54                 else
55                     printf("%d %s\n", after[a].p, dirname[after[a].d+1]); // +1是因为数组下标没有-1
56             }
57             puts("");
58         }
59     }
60     return 0;
61 }

uva 10881 Piotr's Ants 解题报告

时间: 2024-10-16 07:57:58

uva 10881 Piotr's Ants 解题报告的相关文章

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 (等价变换)

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

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>

CSU-ACM暑假集训基础组训练赛(4)解题报告

•Problem A SPOJ SUB_PROB   AC自动机 •题意: 给定一个长为M(M≤100000 )的文本串,和N(N≤1000)个长度不超过2000的模式串,问每个模式串是否在文本串中出现过? •几乎和周一课件上的第一个例题一模一样.. •把文本串丢到AC自动机里面去跑. •注意: •1.可能有两个相同的模式串(略坑吧.) •2.一个模式串可能是另一个模式串的后缀,即如果一个点的fail指针指向的点是一个“危险节点”,那么它本身也是一个“危险节点”. 1 #include <ios

【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

CSU-ACM2014暑假集训基础组训练赛(1) 解题报告

•Problem A HDU 4450                 水题,签到题 水题..没啥好说的.给大家签到用的. 1 #include <cstdio> 2 int main(){ 3 int n,a,ans; 4 while(scanf("%d",&n),n){ 5 ans = 0; 6 for(int i = 0;i < n;i++){ 7 scanf("%d",&a); 8 ans += a*a; 9 } 10 pr

解题报告 之 POJ3057 Evacuation

解题报告 之 POJ3057 Evacuation Description Fires can be disastrous, especially when a fire breaks out in a room that is completely filled with people. Rooms usually have a couple of exits and emergency exits, but with everyone rushing out at the same time