• UVA 10881


    题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1822

    题意:有很多只蚂蚁在一条直线上,每个蚂蚁移动速度都是1,并且有一个初始方向。并且当相邻两个蚂蚁相撞时转向。现在问t时间后各个蚂蚁的位置。

    解法:这题的一个致命技巧就是把两只蚂蚁的相撞看作是两只蚂蚁交换穿过对方并且交换蚂蚁的编号。这个是很好理解的,类似于物理的完全弹性碰撞。又由于任何两只蚂蚁的相对位置在这种转弯的情况下不会改变相对位置,因此我们只要视作所有蚂蚁没有蚂蚁的行动。最后根据位置关系对应到原始的位置关系。最后再做位置判断的时候查看是否超出坐标之外即可。

    下面给出AC代码:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int maxn=10000+5;
     4 struct Ant
     5 {
     6     int id;//顺序
     7     int p;//位置
     8     int d;//转向,-1表示左,0表示碰撞中,1表示右
     9     bool operator <(const Ant& a)const
    10     {
    11         return p<a.p;
    12     }
    13 }before[maxn],after[maxn];
    14 const char dirName[][10]={"L","Turning","R"};
    15 int order[maxn];//输入的第i只蚂蚁是终态中的左数第order[i]只蚂蚁
    16 int main()
    17 {
    18     int K;
    19     scanf("%d",&K);
    20     for(int kase=1;kase<=K;kase++)
    21     {
    22         int L,T,n;
    23         scanf("%d%d%d",&L,&T,&n);
    24         for(int i=0;i<n;i++)
    25         {
    26             int p,d;
    27             char c;
    28             scanf("%d %c",&p,&c);
    29             d=(c=='L'?-1:1);
    30             before[i]=(Ant){i,p,d};
    31             after[i]=(Ant){0,p+T*d,d};//所有的蚂蚁相撞后可以看做对穿而过,这里的id是未知的
    32         }
    33         printf("Case #%d:
    ",kase);
    34         //计算order数组
    35         sort(before,before+n);
    36         for(int i=0;i<n;i++)//最巧妙的地方在这里,第一次从左到右所有的蚂蚁的相对位置没有变化
    37             order[before[i].id]=i;
    38         //计算终态
    39         sort(after,after+n);
    40         for(int i=0;i<n-1;i++)//修改碰撞中的蚂蚁的方向
    41             if(after[i].p==after[i+1].p)
    42                 after[i].d=after[i+1].d=0;
    43         //输出结果
    44         for(int i=0;i<n;i++)
    45         {
    46             int a=order[i];
    47             if(after[a].p<0||after[a].p>L)
    48                 printf("Fell off
    ");
    49             else printf("%d %s
    ",after[a].p, dirName[after[a].d+1]);
    50         }
    51         printf("
    ");
    52     }
    53     return 0;
    54 }
  • 相关阅读:
    基于VLC的视频播放器
    IOS开发之新浪微博OAuth2
    Android之官方导航栏ActionBar
    IOS中键盘隐藏几种方式
    在Android中使用Android Ksoap2调用WebService
    Android之属性动画(二)
    IOS 内存管理
    利用scp 远程上传下载文件/文件夹和ssh远程执行命令
    Centos 检查磁盘读写性能
    JPA, JNDI, OSGi
  • 原文地址:https://www.cnblogs.com/ECJTUACM-873284962/p/7204483.html
Copyright © 2020-2023  润新知