1365 木杆上的蚂蚁

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

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

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
posted @ 2011-04-16 23:11  nightstaker  阅读(831)  评论(0编辑  收藏  举报