【UVA 10881】 经典模拟题

题目链接:http://acm.hust.edu.cn:8080/judge/problem/viewProblem.action?id=25979

题目大意:一根长L厘米的木棍上有n只蚂蚁,每只蚂蚁有个开始的位置和爬行方向,速度为1.当两只蚂蚁相撞后,两者同时掉头继续爬行,求按输入顺序给出每只蚂蚁T秒后的位置后朝向。

 

解题思路:

  1.每只蚂蚁相撞后同时掉头可以看做对穿而过,关键的问题就在于求位置的变化。

  2.按位置从小到大排序,可以惊奇的发现排序后(befor数组和after数组)所有的蚂蚁相对位置并没有变化,改变的只是朝向。

 

 1 #include <iostream>

 2 #include <cstdio>

 3 #include <algorithm>

 4 #include <cstring>

 5 using namespace std;

 6 

 7 const int maxn=10005;

 8 

 9 struct node

10 {

11     int   id, p, d;   //d表示朝向,-1表示左,0表示碰撞中,1表示右。

12     bool operator < (const node& S)const

13     {

14         return p<S.p;

15     }

16 } befor[maxn],after[maxn];

17 

18 char dirname[][10]={"L","Turning","R"};

19 int  order[maxn];

20 

21 int main()

22 {

23     int  T, n, L, t, tcase=0;

24     int  ss[10005];

25     cin >> T;

26     while(T--)

27     {

28         scanf("%d%d%d",&L, &t, &n);

29         printf("Case #%d:\n",++tcase);

30         for(int i=0; i<n; i++)

31         {

32             int  p, d;

33             char c;

34             scanf("%d %c",&p,&c);

35             d=(c=='L'?-1:1);

36             befor[i]=(node){i,p,d};

37             after[i]=(node){0,p+t*d,d};  //所以的蚂蚁相撞后可以看做对穿而过

38         }

39         sort(befor,befor+n);

40         for(int i=0; i<n; i++)  //最巧妙的地方在这里,第一次从左到右所有的蚂蚁的相对位置没有变化

41             order[befor[i].id]=i;

42         sort(after,after+n);

43         for(int i=0; i<n-1; i++)

44             if(after[i].p==after[i+1].p)  after[i].d=after[i+1].d=0;

45         for(int i=0; i<n; i++)

46         {

47             int a=order[i];

48             if(after[a].p>=0&&after[a].p<=L)

49             {

50                 printf("%d %s\n",after[a].p,dirname[after[a].d+1]);

51             }

52             else

53                 printf("Fell off\n");

54         }

55         puts("");

56     }

57     return 0;

58 }

 

 

 

你可能感兴趣的:(uva)