uva10881


本题目是蚂蚁的相遇问题,蚂蚁相遇以后就反向,输出蚂蚁t秒后的次序。
这里用ne数组存下新状态的一切信息。注意交换的次序即可。
因为所有蚂蚁的相对位置不变,所以当前的相对位置也不变。
num存着所有的新位置的相对次序,即当前ne[i].loc是第几大的数字呢?num里面将这个次序分别存下来
order[i]里面则表示 大小顺序序号为i的数据将在第order[i]个输出
之后ne数组又依照数字大小进行了排序,所以此刻ne[order[i]]中的数据就是第i只蚂蚁的数据,就是应该第i个输出的数据。
然后注意方向,ne[i].dir的方向是否为turning,应该比较ne[i-1].loc与<span style="line-height: 17.6px;">ne[i].loc</span>
,最后得出方向。(如果相邻的蚂蚁的位置相等,那么意味着这两只蚂蚁相遇,都在转向了)。


#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;

const int N=100001;
int l,t,n;
struct data
{
    int loc,id;
    int dir;
}d[200007],ne[N];

int num[N];
char s[3][100]={"L","Turning","R"};

bool cmp(int x,int y)
{

    return d[x].loc<d[y].loc;
}
bool ccc(data a,data b)
{

    return a.loc<b.loc;
}
int order[N];
int main()
{
int cas=1;
    int T;
    scanf("%d",&T);
    while(T--)
    {

        printf("Case #%d:\n",cas++);
        scanf("%d%d%d",&l,&t,&n);
        for(int i=0;i<n;i++)
        {
            num[i]=i;
            char ss[10];
            int x;
            scanf("%d%s",&x,ss);
         //   printf("x:%d  s:%s\n",x,ss);
            d[i].loc=x;

            d[i].id=i;
            if(ss[0]=='R')
            {
                ne[i].loc=(x+t);
             d[i].dir=ne[i].dir=1;
            }
            else
            {
                ne[i].loc=(x-t);
                 d[i].dir= ne[i].dir=-1;
            }

        }
        sort(num,num+n,cmp);
      //  sort(d,d+n,ccc);
        for(int i=0;i<n;i++)
            order[num[i]]=i;
            //order[d[i].id]=i;
        sort(ne,ne+n,ccc);
        for(int i=0;i<n-1;i++)
        {
            if(ne[i].loc==ne[i+1].loc)
            {
                ne[i].dir=ne[i+1].dir=0;
            }
        }
        for(int i=0;i<n;i++)
        {
            int now=order[i];
            if(ne[now].loc<0||ne[now].loc>l)
            {
                puts("Fell off");
            }
            else
            {
                printf("%d %s\n",ne[now].loc,s[ne[now].dir+1]);
            }

        }
        puts("");



    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值