cdoj1365 木杆上的蚂蚁
Description
在一根细木杆上,有一些速度相同蚂蚁,它们有的往左走,有的往右走,木杆很细,只允许一只蚂蚁通过,所以当两只蚂蚁碰头的时候,它们会掉头继续前进,直到走出边界,掉下木杆。
已知木杆的长度和每只蚂蚁的名字、位置和初始方向,问依次掉下木杆的蚂蚁花费的时间以及它的名字。
分析:
对于杆上的蚂蚁,当两个蚂蚁碰头后,它们互换方向,但是我们仍然可以看成它们的方向没有改变,只是一只蚂蚁的路程让另外一只来走而已,所以对于每一只蚂蚁,如果不区分它们,那么它们的时间是可以求出来的,即它们所在的位置到终点的位移。由于每一只蚂蚁的相对位置没有改变,因此根据时间的先后和对应那只蚂蚁的方向,我们就知道了每只蚂蚁出队的顺序,仔细考虑下还是很简单的。
代码:
#include<iostream> #include<algorithm> #include<cmath> #include<stdlib.h> #include<stdio.h> #include<string.h> #include<queue> #include<deque> //#define DEBUG //todo using namespace std; int nn; struct node { char name[12]; int loc; int dir; int s; }ar[110]; int ans,T,N,L,s[110]; deque<node> dq; bool cmp(node a,node b) { return a.loc<b.loc; } void ini() { cin>>T; } void work() { int ith=1; while(T--){ dq.clear(); char d; cin>>N>>L; for(int i=1;i<=N;i++) { getchar(); scanf("%s %d %c",ar[i].name,&ar[i].loc,&d); if(d=='R') ar[i].dir=1; else ar[i].dir=-1; if(d=='R') ar[i].s=L-ar[i].loc; else ar[i].s=ar[i].loc; s[i]=ar[i].s; } sort(ar+1,ar+1+N,cmp); for(int i=1;i<=N;i++) dq.push_back(ar[i]); sort(s+1,s+1+N); printf("Case #%d:\n",ith++); for(int i=1;i<=N;i++){ printf("%d ",s[i]); for(int j=1;j<=N;j++) { if(ar[j].s==s[i]) { if(ar[j].dir==1) { printf("%s\n",dq.back().name); dq.pop_back(); break; } else { printf("%s\n",dq.front().name); dq.pop_front(); break; } } } } } } int main() { ini(); work(); #ifdef DEBUG cin>>nn; #endif return 0; }