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:
",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
",dq.back().name);
                        dq.pop_back();
                        break;
                    }
                    else {
                        printf("%s
",dq.front().name);
                        dq.pop_front();
                        break;
                    }
                }
            }
        }
    }
}

int main()
{
    ini();
    work();
#ifdef DEBUG
    cin>>nn;
#endif
    return 0;
}
原文地址:https://www.cnblogs.com/au-xiaotian/p/3446449.html