uva 10881 Piotr's Ants

https://vjudge.net/problem/UVA-10881

题意:

一根长为L cm的木棍上有很多只蚂蚁,他们的速度为1cm每秒,他们的有的向右,有的向左。当两只蚂蚁相撞的时候,他们各自掉头往回走,碰撞的时间可以忽略不记。

现在给出若干只蚂蚁起始时刻的位置和方向,问经过t秒钟后,这些蚂蚁的位置和朝向。

思路:

很脑洞的一道题,如果我们忽略蚂蚁的编号就可以发现,每只蚂蚁是没有区别的,即两只蚂蚁的碰撞可以看成他们直接穿过。

那么我们就可以方便的计算每只蚂蚁的最终位置了。

之后需要想到的是,不忽略每只蚂蚁的编号那么每只蚂蚁的顺序是固定的(这个需要好好理解),因为一只蚂蚁如果位于两只蚂蚁的中间,如果他们不相撞,那么肯定始终是在中间的;如果相撞的话,就一直来回来回的碰碰碰。。。。2333

所以是一直在中间的,那么这方便我们计算每只蚂蚁经过t时刻之后的朝向,这可以看成是每只蚂蚁状态的传递。

由于输入的时候不是按照从左到右的顺序输入的,所以我们需要用一个数组来保存位置。

代码:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <algorithm>
 4 using namespace std;
 5 
 6 struct node
 7 {
 8     int id;
 9     int p;
10     int sta;
11 
12     bool operator < (const node& rhs) const
13     {
14         return p < rhs.p;
15     }
16 } before[10005],after[10005];
17 
18 int ord[10005];
19 
20 int main()
21 {
22     int cas;
23 
24     scanf("%d",&cas);
25 
26     for (int k = 1;k <= cas;k++)
27     {
28         int l,t,n;
29 
30         scanf("%d%d%d",&l,&t,&n);
31 
32         for (int i = 0;i < n;i++)
33         {
34             int p;
35             char c;
36             int d;
37 
38             scanf("%d %c",&p,&c);
39 
40             if (c == 'R') d = 1;
41             else d = -1;
42 
43             before[i] = node{i,p,d};
44             after[i] = node{-1,p + t * d,d};
45         }
46 
47         sort(before,before + n);
48 
49         for (int i = 0;i < n;i++)
50             ord[before[i].id] = i;
51 
52         sort(after,after + n);
53 
54         for (int i = 0;i < n - 1;i++)
55         {
56             if (after[i].p == after[i+1].p) after[i].sta = after[i+1].sta =  0;//正在相撞
57         }
58 
59         printf("Case #%d:
",k);
60 
61         for (int i = 0;i < n;i++)
62         {
63             int j = ord[i];
64 
65             if (after[j].p < 0 || after[j].p > l) printf("Fell off
");
66             else if (after[j].sta == -1) printf("%d %s
",after[j].p,"L");
67             else if (after[j].sta == 1) printf("%d %s
",after[j].p,"R");
68             else printf("%d %s
",after[j].p,"Turning");
69         }
70 
71         printf("
");
72     }
73 
74     return 0;
75 }
原文地址:https://www.cnblogs.com/kickit/p/7573382.html