链接:http://acm.hust.edu.cn/vjudge/problem/25979分析:n只蚂蚁在爬,将n只蚂蚁距离木棍左端的距离从小到大排序后它们的相对顺序是不变的,因为碰到另一只蚂蚁两只蚂蚁就会掉头,蚂蚁就像一个弹珠来回弹,但整体上“掉头”等价于“对穿而过”,但题目要求输入时的顺序输出,所以并不是所有蚂蚁都是一样的,还要认清谁是谁,所以如果蚂蚁1初始状态为(3,R)两秒后在(5,R)的位置会出现一只蚂蚁但不一定是蚂蚁1,但是可以肯定(5,R)位置上的蚂蚁相对于其它蚂蚁的顺序和初始状态时的相对顺序是一样的,所以把初始状态和T秒后的状态按pos从小到大排序,将输入顺序映射到初始状态的相对顺序上,按初始相对顺序(等于最终相对顺序)取出after中T秒后的各个蚂蚁的状态,还要处理好碰撞的情况,最后打印输出就好了。
1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 5 const int maxn = 10000 + 5; 6 7 struct Ant { 8 int id, pos, dir; 9 bool operator < (const Ant& rhs) const { 10 return pos < rhs.pos; 11 } 12 } before[maxn], after[maxn]; 13 14 const char dirName[3][10] = {"L", "Turning", "R"}; 15 int order[maxn]; 16 17 int main() { 18 int T; 19 scanf("%d", &T); 20 for (int kase = 1; kase <= T; kase++) { 21 int L, t, n; 22 scanf("%d%d%d", &L, &t, &n); 23 for (int i = 0; i < n; i++) { 24 char ch; int x, d; scanf("%d %c", &x, &ch); d = (ch == ‘L‘ ? -1 : 1); 25 before[i].id = i, before[i].pos = x, before[i].dir = d; 26 after[i].id = 0, after[i].pos = x + t * d, after[i].dir = d; 27 } 28 sort(before, before + n); 29 for (int i = 0; i < n; i++) 30 order[before[i].id] = i; 31 sort(after, after + n); 32 for (int i = 0; i < n - 1; i++) 33 if (after[i].pos == after[i + 1].pos) after[i].dir = after[i + 1].dir = 0; 34 printf("Case #%d:\n", kase); 35 for (int i = 0; i < n; i++) { 36 int num = order[i]; 37 if (after[num].pos < 0 || after[num].pos > L) printf("Fell off\n"); 38 else printf("%d %s\n", after[num].pos, dirName[after[num].dir + 1]); 39 } 40 printf("\n"); 41 } 42 return 0; 43 }
UVa10881 Piotr's Ants (思维)
时间: 2024-10-28 10:43:29