一般的木杆与蚂蚁问题在前面的1025中已经讲过了,此题中的依次掉下木杆的蚂蚁花费的时间可以同理求出,再用一个数组进行保存就可以了,而这个题较难的就是对依次掉下木杆的蚂蚁名字进行输出。首先,我们明确:依次掉下木杆的蚂蚁掉落方向方向可以记录(这在前面求时间的过程中可以完成),然后,我们明白,第一只从左边掉落的蚂蚁一定是一开始在最左边的蚂蚁,右边同理,也就是说,某一时刻从左边掉落的蚂蚁一定是当前最左边的蚂蚁。而自始至终所有蚂蚁的相对位置都不会改变。这样想,处理就非常简单了。将蚂蚁的名字放到一个队列中,根据蚂蚁依次掉落的方向对蚂蚁的名字输出并从相应方向出队!提示:蚂蚁依次掉落的方向可以用时间的正负进行标记,我们只需按时间的绝对值对时间进行排序就能完成处理了!
下面是AC代码,大家可以参考一下:


1
#include
<
stdio.h
>
2 #include < stdlib.h >
3 #include < string .h >
4 struct ant
5 { char name[ 11 ];
6 int l;
7 }a[ 101 ];
8 int main()
9 { int n,m,T,cas = 1 ,time[ 101 ],i,j;
10 char ch;
11 scanf( " %d " , & T);
12 while (T -- )
13 { scanf( " %d%d " , & n, & m);
14 printf( " Case #%d:\n " ,cas ++ );
15 for (i = 0 ;i < n;i ++ )
16 { scanf( " %s%d %c " ,a[i].name, & a[i].l, & ch);
17 if (ch == ' L ' ) time[i] = a[i].l;
18 else time[i] = a[i].l - m;
19 }
20 for (i = 1 ;i < n;i ++ )
21 { if (abs(time[i]) < abs(time[i - 1 ]))
22 { int t = abs(time[i]),p = time[i];
23 for (j = i - 1 ;j >= 0 && t < abs(time[j]);j -- )
24 time[j + 1 ] = time[j];
25 time[j + 1 ] = p;
26 }
27 }
28 for (i = 1 ;i < n;i ++ )
29 { if (a[i].l < a[i - 1 ].l)
30 { ant t = a[i];
31 for (j = i - 1 ;j >= 0 && t.l < a[j].l;j -- )
32 a[j + 1 ] = a[j];
33 a[j + 1 ] = t;
34 }
35 }
36 int left = 0 ,right = n - 1 ;
37 for (i = 0 ;i < n;i ++ )
38 { if (time[i] > 0 )
39 { printf( " %d %s\n " ,time[i],a[left].name);
40 left += 1 ;
41 }
42 else
43 { printf( " %d %s\n " , - time[i],a[right].name);
44 right -= 1 ;
45 }
46 }
47 }
48 return 0 ;
49 }
50
2 #include < stdlib.h >
3 #include < string .h >
4 struct ant
5 { char name[ 11 ];
6 int l;
7 }a[ 101 ];
8 int main()
9 { int n,m,T,cas = 1 ,time[ 101 ],i,j;
10 char ch;
11 scanf( " %d " , & T);
12 while (T -- )
13 { scanf( " %d%d " , & n, & m);
14 printf( " Case #%d:\n " ,cas ++ );
15 for (i = 0 ;i < n;i ++ )
16 { scanf( " %s%d %c " ,a[i].name, & a[i].l, & ch);
17 if (ch == ' L ' ) time[i] = a[i].l;
18 else time[i] = a[i].l - m;
19 }
20 for (i = 1 ;i < n;i ++ )
21 { if (abs(time[i]) < abs(time[i - 1 ]))
22 { int t = abs(time[i]),p = time[i];
23 for (j = i - 1 ;j >= 0 && t < abs(time[j]);j -- )
24 time[j + 1 ] = time[j];
25 time[j + 1 ] = p;
26 }
27 }
28 for (i = 1 ;i < n;i ++ )
29 { if (a[i].l < a[i - 1 ].l)
30 { ant t = a[i];
31 for (j = i - 1 ;j >= 0 && t.l < a[j].l;j -- )
32 a[j + 1 ] = a[j];
33 a[j + 1 ] = t;
34 }
35 }
36 int left = 0 ,right = n - 1 ;
37 for (i = 0 ;i < n;i ++ )
38 { if (time[i] > 0 )
39 { printf( " %d %s\n " ,time[i],a[left].name);
40 left += 1 ;
41 }
42 else
43 { printf( " %d %s\n " , - time[i],a[right].name);
44 right -= 1 ;
45 }
46 }
47 }
48 return 0 ;
49 }
50