1365 木杆上的蚂蚁

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

下面是AC代码,大家可以参考一下:

ContractedBlock.gif ExpandedBlockStart.gif View Code

   
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

转载于:https://www.cnblogs.com/gcb-1991/archive/2011/04/16/2018559.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值