算法入门经典训练指南上的题。

这里有必要讲一下蚂蚁爬杆问题:每只蚂蚁都有一个初始方向,相撞会转向,关键就是相撞的处理,由于速度并不会改变,两只蚂蚁相撞,可以看做,两只蚂蚁穿过对方,继续沿原方向前进,经过t秒,最后蚂蚁的最终位置是固定的,但是对应位置的蚂蚁有可能不再是原来的蚂蚁;现在考虑经过t秒后蚂蚁的位置,假设蚂蚁刚开始以离杆的左端距离升序排序,那么t秒后,他们的位置排序不会改变,举例说明:如果以前有一只蚂蚁排在第二,t秒后它仍然在第二。

AC代码:

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=10000+5;
struct node{
    int num;
    int pos;
    char dir;
}a[maxn],b[maxn];
bool cmp1(node &p1,node &p2){
    return p1.pos<p2.pos;
}
bool cmp2(node &p1,node &p2){
    return p1.num<p2.num;
}
int main(){
    int T,kase=1;
    scanf("%d",&T);
    while(T--){

        int len,t,n;
        scanf("%d%d%d",&len,&t,&n);
        int pos;
        char dir;
        for(int i=0;i<n;++i){
            scanf("%d %c",&a[i].pos,&a[i].dir);
            a[i].num=i;
            b[i].dir=a[i].dir;
            if(b[i].dir=='L') b[i].pos=a[i].pos-t;
            else b[i].pos=a[i].pos+t;
        }
        sort(b,b+n,cmp1);
        sort(a,a+n,cmp1);
        for(int i=0;i<n;++i){
            if((i<n-1&&b[i].pos==b[i+1].pos)||(i>0&&b[i].pos==b[i-1].pos)){
                a[i].pos=b[i].pos;
                a[i].dir='r';
            }
            else{
                 a[i].pos=b[i].pos;
                a[i].dir=b[i].dir;
            }
        }
        sort(a,a+n,cmp2);
        printf("Case #%d:\n",kase++);
        for(int i=0;i<n;++i){
            if(a[i].pos<0||a[i].pos>len) printf("Fell off\n");
            else if(a[i].dir=='r') printf("%d Turning\n",a[i].pos);
            else printf("%d %c\n",a[i].pos,a[i].dir);
        }
        printf("\n");
    }
    return 0;
}

如有不当之处欢迎指出!

蚂蚁爬杆问题 UVA 10881的更多相关文章

  1. 蚂蚁爬杆问题js实现

    运行效果 代码 <!DOCTYPE html> <html> <head> <title>蚂蚁爬杆实验</title> <script ...

  2. cogs 1456. [UVa 10881,Piotr's Ants]蚂蚁

    1456. [UVa 10881,Piotr's Ants]蚂蚁 ★   输入文件:Ants.in   输出文件:Ants.out   简单对比时间限制:1 s   内存限制:128 MB [题目描述 ...

  3. POJ 1852 Ants || UVA 10881 - Piotr's Ants 经典的蚂蚁问题

    两题很有趣挺经典的蚂蚁问题. 1.n只蚂蚁以1cm/s的速度在长为L的竿上爬行,当蚂蚁爬到竿子的端点就会掉落.当两只蚂蚁相撞时,只能各自反向爬回去.对于每只蚂蚁,给出距离左端的距离xi,但不知道它的朝 ...

  4. UVA.10881 Piotr's Ants (思维题)

    UVA.10881 Piotr's Ants (思维题) 题意分析 有一根长度为L cm的木棍,上有n只蚂蚁,蚂蚁要么向左爬,要么向右,速度均为1cm/s,若2只蚂蚁相撞,则蚂蚁同时调头.求解第T秒时 ...

  5. 思维题 UVA 10881 Piotr's Ants

    题目传送门 /* 题意:在坐标轴上一群蚂蚁向左或向右爬,问经过ts后,蚂蚁的位置和状态 思维题:本题的关键1:蚂蚁相撞看作是对穿过去,那么只要判断谁是谁就可以了 关键2:蚂蚁的相对位置不变 关键3:o ...

  6. 【UVa 10881】Piotr's Ants

    Piotr's Ants Porsition:Uva 10881 白书P9 中文改编题:[T^T][FJUT]第二届新生赛真S题地震了 "One thing is for certain: ...

  7. LightOJ 1323 Billiard Balls(找规律(蚂蚁爬木棍))

    题目链接:https://vjudge.net/contest/28079#problem/M 题目大意: 一个边界长为L宽为W的平面同时发射n个台球,运动K秒,台球碰到桌面及两(多)个台球相撞情况如 ...

  8. [ACM_模拟] UVA 10881 Piotr's Ants[蚂蚁移动 数组映射 排序技巧]

    "One thing is for certain: there is no stopping them;the ants will soon be here. And I, for one ...

  9. Uva 10881 Piotr’s Ants 蚂蚁

    一根长度为 L 厘米的木棍上有 n 只蚂蚁,每只蚂蚁要么朝左爬,要么朝右爬,速度为 1 厘米/秒.当两只蚂蚁相撞时,二者同时调头(掉头用的时间忽略不计).给出每只蚂蚁的初始位置和朝向,计算 T 秒之后 ...

随机推荐

  1. Navicat for MySQL导出表结构脚本的方法

    使用MySQL可视化工具Navicat导出MySQL的表结构脚本的方法. 1.右键Navicat中的数据库→数据传输(Data Transfer). 2.左边数据库对象(Database Object ...

  2. 【转】Linux从入门到精通——运维工程师成长路线图——CTO马哥Linux视频教学

    加油! http://edu.51cto.com/roadmap/view/id-2.html#6853467-sqq-1-36881-57ccc7d95ea58df839decd91bd220170

  3. lodash源码分析之baseFindIndex中的运算符优先级

    我悟出权力本来就是不讲理的--蟑螂就是海米:也悟出要造反,内心必须强大到足以承受任何后果才行. --北岛<城门开> 本文为读 lodash 源码的第十篇,后续文章会更新到这个仓库中,欢迎 ...

  4. 通过重写 class 的 ToString() 来简化获取 enum 的 DescriptionAttribute 值

    通过重写 class 的 ToString() 来简化获取 enum 的 DescriptionAttribute 值 目录 一.常见的 enum 类型 二.演变:class 版本的 enum 类型 ...

  5. 自己收集的工作js库---2018-02-07

    今年工作进度到这里结束,整理一下今年收集的自用js库,后期会更新,代码已贴github=>https://github.com/lpg-kobe/personal-github /** * @p ...

  6. Spring的事务管理(理论篇,下篇提供代码实现)

    事务:逻辑上的一组操作,这组操作要么全部成功,要么全部失败(事务十大特性:原子性,一致性,隔离性,持久性) 原子性:事务是不可分割的工作单位,事务中的操作要么都发生了,要么都不发生.(也就是说不能单独 ...

  7. Spring基础篇——bean的自动化装配

    上篇博文讲Spring的IOC容器时说道,虽然容器功能强大,但容器本身只是个空壳,需要我们主动放入装配对象,并告诉它对象之间的协作关系,然后容器才能按照我们的指示发挥它的魔力,完成装配bean的使命. ...

  8. BZOJ 3566: [SHOI2014]概率充电器 [树形DP 概率]

    3566: [SHOI2014]概率充电器 题意:一棵树,每个点\(q[i]\)的概率直接充电,每条边\(p[i]\)的概率导电,电可以沿边传递使其他点间接充电.求进入充电状态的点期望个数 糖教题解传 ...

  9. 洛谷 P3674 小清新人渣的本愿 [莫队 bitset]

    传送门 题意: 给你一个序列a,长度为n,有Q次操作,每次询问一个区间是否可以选出两个数它们的差为x,或者询问一个区间是否可以选出两个数它们的和为x,或者询问一个区间是否可以选出两个数它们的乘积为x ...

  10. new function

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...