uva 10881 Piotr'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 long. Each ant is facing either left or right and walks at a constant speed of 1 cm/s. When two ants bump into each other, they both turn around (instantaneously) and start walking in opposite directions. Piotr knows where each of the
ants starts and which direction it is facing and wants to calculate where the ants will end up
T seconds from now.

Input

The first line of input gives the number of cases, N. N test cases follow. Each one starts with a line containing 3 integers:
L , T and n (0 <=
n
<= 10000) . The next n lines give the locations of the
n ants (measured in 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 by
n lines describing the locations and directions of the n ants in the same format and order as in the input. If two or more ants are at the same location, print "Turning" instead of "L" or "R" for their direction. If an ant
falls off the pole beforeT 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

题目大意:第一个数据代表数据组数,接下来三个数据 L T n ,分别代表棍长,时长以及蚂蚁数量,接下来n行是蚂蚁的初始位置以及初始方向。要求求出经过T秒后,各蚂蚁的状况。(相对棍子左端的距离,方向)蚂蚁相撞后会各自回头。若经过T秒后,两蚂蚁处于相同位置,则输出“该位置 + Turning”,若已离开木棍(刚好在木棍两端不算)输出“Fell off”,否则输出当前蚂蚁的状态。

解题思路:可以将相撞的蚂蚁,看成是对穿而过。只要记录各蚂蚁的起始编号,在模拟完成后,该蚂蚁的编号位置不会变。

#include<stdio.h>
#include<algorithm>
#include<math.h>
using namespace std;
struct ANTS {
	int num;
	int pos;
	char dir;
};
int cmp(ANTS a, ANTS b) {
	return a.pos < b.pos;
}
ANTS ants[10005], antsb[10005];
int kep[10005];
int main() {
	int m, cnt = 1;
	scanf("%d", &m);
	while (m--) {
		int L, T, n, tempi;
		char tempc;
		scanf("%d %d %d", &L, &T, &n);
		for (int i = 1; i <= n; i++) {
			scanf("%d %c\n", &tempi, &tempc);
			ants[i].num = 0;
			antsb[i].num = i;
			ants[i].pos = antsb[i].pos = tempi;
			ants[i].dir = antsb[i].dir = tempc;
		}
		sort(antsb + 1, antsb + n + 1, cmp);
		for (int i = 1; i <= n; i++) {
			kep[antsb[i].num] = i;
		}
		for (int i = 1; i <= n; i++) {
			if (ants[i].dir == 'R') {
				ants[i].pos += T;
			}
			else ants[i].pos -= T;
		}
		sort(ants + 1, ants + n + 1, cmp);
		for (int i = 1; i < n; i++) {
			if (ants[i].pos == ants[i + 1].pos) {
				ants[i].dir = ants[i + 1].dir = 'T';
			}
		}
		printf("Case #%d:\n", cnt++);
		for (int i = 1; i <= n; i++) {
			int a = kep[i];
			if (ants[a].pos < 0 || ants[a].pos > L) {
				printf("Fell off\n");
				continue;
			}
			if (ants[a].dir == 'T') {
				printf("%d Turning\n", ants[a].pos);
				continue;
			}
			else printf("%d %c\n", ants[a].pos, ants[a].dir);
		}
		printf("\n");
	}
	return 0;
}

uva 10881 Piotr's Ants (模拟)

时间: 2024-10-11 04:34:07

uva 10881 Piotr's Ants (模拟)的相关文章

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

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

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

记得之前做过一个类似的,这里的话蚂蚁碰见掉头和碰见穿过去起始本质上都是一样的,只不过相撞之后蚂蚁对应的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

UVA-10881 - Piotr&#39;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 horizontal

UVA 10142 Australian Voting(模拟)

题意:澳大利亚投票系统要求选民们将所有候选人按愿意选择的程度排序,一张选票就是一个排序.一开始,每张选票的首选项将被统计.若有候选人得票超过50%,他讲直接胜出:否则,所有并列最低的候选人出局,而那些将出局候选人排在第一位的选票将被重新统计为排名最高的未出局候选人.这一筛选过程将持续进行,直到某个候选人得到超过50%的选票,或所有候选人得票相同. #include<cstdio> #include<cstring> #include<iostream> #include