cdoj1365木杆上的蚂蚁
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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 return0;
}。