• uva 10881 Piotr's Ants


    https://vjudge.net/problem/UVA-10881

    题意:

    一根长为L cm的木棍上有很多只蚂蚁,他们的速度为1cm每秒,他们的有的向右,有的向左。当两只蚂蚁相撞的时候,他们各自掉头往回走,碰撞的时间可以忽略不记。

    现在给出若干只蚂蚁起始时刻的位置和方向,问经过t秒钟后,这些蚂蚁的位置和朝向。

    思路:

    很脑洞的一道题,如果我们忽略蚂蚁的编号就可以发现,每只蚂蚁是没有区别的,即两只蚂蚁的碰撞可以看成他们直接穿过。

    那么我们就可以方便的计算每只蚂蚁的最终位置了。

    之后需要想到的是,不忽略每只蚂蚁的编号那么每只蚂蚁的顺序是固定的(这个需要好好理解),因为一只蚂蚁如果位于两只蚂蚁的中间,如果他们不相撞,那么肯定始终是在中间的;如果相撞的话,就一直来回来回的碰碰碰。。。。2333

    所以是一直在中间的,那么这方便我们计算每只蚂蚁经过t时刻之后的朝向,这可以看成是每只蚂蚁状态的传递。

    由于输入的时候不是按照从左到右的顺序输入的,所以我们需要用一个数组来保存位置。

    代码:

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <algorithm>
     4 using namespace std;
     5 
     6 struct node
     7 {
     8     int id;
     9     int p;
    10     int sta;
    11 
    12     bool operator < (const node& rhs) const
    13     {
    14         return p < rhs.p;
    15     }
    16 } before[10005],after[10005];
    17 
    18 int ord[10005];
    19 
    20 int main()
    21 {
    22     int cas;
    23 
    24     scanf("%d",&cas);
    25 
    26     for (int k = 1;k <= cas;k++)
    27     {
    28         int l,t,n;
    29 
    30         scanf("%d%d%d",&l,&t,&n);
    31 
    32         for (int i = 0;i < n;i++)
    33         {
    34             int p;
    35             char c;
    36             int d;
    37 
    38             scanf("%d %c",&p,&c);
    39 
    40             if (c == 'R') d = 1;
    41             else d = -1;
    42 
    43             before[i] = node{i,p,d};
    44             after[i] = node{-1,p + t * d,d};
    45         }
    46 
    47         sort(before,before + n);
    48 
    49         for (int i = 0;i < n;i++)
    50             ord[before[i].id] = i;
    51 
    52         sort(after,after + n);
    53 
    54         for (int i = 0;i < n - 1;i++)
    55         {
    56             if (after[i].p == after[i+1].p) after[i].sta = after[i+1].sta =  0;//正在相撞
    57         }
    58 
    59         printf("Case #%d:
    ",k);
    60 
    61         for (int i = 0;i < n;i++)
    62         {
    63             int j = ord[i];
    64 
    65             if (after[j].p < 0 || after[j].p > l) printf("Fell off
    ");
    66             else if (after[j].sta == -1) printf("%d %s
    ",after[j].p,"L");
    67             else if (after[j].sta == 1) printf("%d %s
    ",after[j].p,"R");
    68             else printf("%d %s
    ",after[j].p,"Turning");
    69         }
    70 
    71         printf("
    ");
    72     }
    73 
    74     return 0;
    75 }
  • 相关阅读:
    函数length属性
    vue面试题
    ES6引进新的原始数据类型symbol使用及特性
    jq动画
    防抖和节流
    this指向
    前端:性能优化之回流和重绘
    react生命周期
    vue生命周期
    react-redux的实现原理
  • 原文地址:https://www.cnblogs.com/kickit/p/7573382.html
Copyright © 2020-2023  润新知