蚂蚁

题目来源 :《算法竞赛入门经典——训练指南》/刘汝佳,陈锋编著

一根长度为L厘米的木棍上有n只蚂蚁,每只蚂蚁要么朝左爬,要么朝右爬,速度为1厘米/秒。当两只蚂蚁相撞时,二者同时掉头(掉头时间忽略不计)。给出每只蚂蚁的初始位置和朝向,计算T秒之后每只蚂蚁的位置。
【输入格式】
输入的第一行为数据组数。每组数据的第一行为3个正整数L,T,n(0≤n≤10000);以下n行每行描述一只蚂蚁的初始位置,其中,整数x为蚂蚁距离木棍左端的距离(单位:
厘米),字母表示初始朝向(L表示朝左,R表示朝右)。
【输出格式】
对于每组数据,输出n行,按输入顺序输出每只蚂蚁的位置和朝向(Turning表示正在碰撞)。在第T秒之前已经掉下木棍的蚂蚁(正好爬到木棍边缘的不算)输出Fell off。
【样例输入】
2
10 1 4
1 R
5 R
3 L
10 R
10 2 3
4 R
5 L
8 R

【样例输出】

Case #1:
2 Turning
6 R
2 Turning
Fell off
Case #2:
3 L
6 R
10 R

示例代码

//代码来源:《算法竞赛入门经典——训练指南》/刘汝佳,陈锋编著.#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 10000 + 5;struct Ant{int id; //enter orderint p; //positionint d; //direct -1 left, 0 turning, 1 right bool operator<(const Ant& a) const{return p < a.p;}
}before[maxn], after[maxn];const char dirName[][10] = {"L", "Turning", "R"};int order[maxn]; //输入的第i只蚂蚁, 是终态中左数第order[i]只蚂蚁int main(){int K;scanf("%d", &K);for(int kase = 1; kase <= K; kase++){int L, T, n; //length time numberOfAnts printf("Case #%d:\n", kase);scanf("%d%d%d", &L, &T, &n);for(int i = 0; i < n; i++){int p, d;char c;scanf("%d %c", &p, &c);d = (c == 'L' ? -1 : 1);before[i] = (Ant){i, p, d};after[i] = (Ant){0, p+T*d, d}; //id is unknown}//order listsort(before, before+n);for(int i = 0; i <= n - 1; i ++)order[before[i].id] = i;//finalsort(after, after+n);for(int i = 0; i < n-1; i++)if(after[i].p == after[i+1].p)after[i].d = after[i + 1].d = 0;// Turning //outputfor(int i = 0; i < n; i++){int a = order[i];if(after[a].p < 0 || after[a].p > L)printf("Fell off\n");elseprintf("%d %s\n", after[a].p, dirName[after[a].d + 1]);}printf("\n");}return 0;
}

总结

  1. 所有蚂蚁的相对位置保持不变, 在不掉下木板的情况下, 所有的蚂蚁都可以看成是"往复运动"
  2. 朝向某方向蚂蚁的个数不变, 也就是说, 原来有2只朝右2只朝左的蚂蚁, 碰撞过后还是有2只朝右2只朝左的蚂蚁
  3. 蚂蚁碰撞的时候可以看成"对穿而过", 我们可以由此找出每个蚂蚁最终的位置和朝向(而不用在意是哪一只蚂蚁)
  4. 我们的逻辑是"知道最后一定会有蚂蚁在这个位置, 再去找应该在这个位置的蚂蚁", 而不是"由蚂蚁计算它最后的位置"
  5. 找到了"应该在这个位置的蚂蚁"之后, 这个蚂蚁的方向也就确定了(方向在第3步得出)
  6. 另外, 我们可以根据输入顺序给蚂蚁加一个标签(id), 来在最后的结果中选择输出
  • 在结构体中重载了<以排序
  • dirName 与 蚂蚁的 d + 1 相对应 便于输出
  • 使用0/1/-1代表蚂蚁状态

1.1.5 蚂蚁。一根长度为L厘米的木棍上有n只蚂蚁,每只蚂蚁要么朝左爬,要么朝右爬,速度为1厘米/秒。相关推荐

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

    文件名:[作业] 作者:〈漆黑〉 描述:〈 一根长度为M厘米的木棍上有n只蚂蚁,每只蚂蚁要么朝左爬,要么朝右爬,速度为每秒1厘米.当两只蚂蚁对撞时,二者同时掉头(掉头时间忽略不计).给出每只蚂蚁的初始 ...

  2. [经典面试题][百度]数轴上从左到右有n各点a[0], a[1], ……,a[n -1],给定一根长度为L的绳子,求绳子最多能覆盖其中的几个点。...

    题目 数轴上从左到右有n各点a[0], a[1], --,a[n -1],给定一根长度为L的绳子,求绳子最多能覆盖其中的几个点. 思路一 遍历所有区间跟绳子L比较. i遍历区间起点,j遍历区间终点. ...

  3. 木棍上的蚂蚁jolj2466 模拟法

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

  4. 《庄子》中说到,“一尺之棰,日取其半,万世不竭”。第一天有一根长度为 a的木棍,从第二天开始,每天都要将这根木棍锯掉一半

    26,<庄子>中说到,"一尺之棰,日取其半,万世不竭".第一天有一根长度为 a的木棍,从第二天开始,每天都要将这根木棍锯掉一半 (每次除 2,向下取整).第几天的时候木 ...

  5. 剑指offer_1:给你一根长度为n的绳子,把绳子剪成m段(m、n都是整数且m 1, n 1),m段绳子的长度依然是整数,求m段绳子的长度乘积最大为多少?  * 比如绳子长度为8,我们可以分成

    package Chap2;/**问题描述* 给你一根长度为n的绳子,把绳子剪成m段(m.n都是整数且m > 1, n > 1),m段绳子的长度依然是整数,求m段绳子的长度乘积最大为多少? ...

  6. 给你一根长度为n的绳子,请把绳子剪成m段(m、n都是整数,n1并且m1),每段绳子的长度记为k[0],k[1],...,k[m]。请问k[0]xk[1]x...xk[m]可能的最大乘积是多少?例如

    给你一根长度为n的绳子,请把绳子剪成m段(m.n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],-,k[m].请问k[0]xk[1]x-xk[m]可能的最大乘积是多少? ...

  7. 标题:蚂蚁感冒 长100厘米的细长直杆子上有n只蚂蚁。它们的头有的朝左,有的朝右。 每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒。 当两只蚂蚁碰面时,它们会同时掉头

    标题:蚂蚁感冒 长100厘米的细长直杆子上有n只蚂蚁.它们的头有的朝左,有的朝右. 每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒.当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行.这些蚂蚁中,有1只 ...

  8. HDU 2243 考研路茫茫——单词情结 求长度小于等于L的通路总数的方法

    http://acm.hdu.edu.cn/showproblem.php?pid=2243 这是一题AC自动机 + 矩阵快速幂的题目, 首先知道总答案应该是26^1 + 26^2 + 26^3 .. ...

  9. 设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是Li, 1<= i<= n。这n 个程序的读取概率分别是p1,p2,...,pn,且pi+p2+...+pn =

    设有n 个程序{1,2,-, n }要存放在长度为L的磁带上.程序i存放在磁带上的长度是Li, 1<= i<= n.这n 个程序的读取概率分别是p1,p2,-,pn,且pi+p2+-+pn ...

最新文章

  1. 使用javax.tools.JavaCompiler根据字符串内容动态生成新的Java类并编译成.class
  2. Burp Suite Scanner Module - 扫描模块
  3. Atitit 调用另外语言的功能 目录 1. Waht 常见的语言java python js sql xml h5 c# php等之间的互相调用 1 2. 为什么需要互相调用why 1 3. 常
  4. 数字通信计算机仿真问题汇总,燕山大学数字通信计算机仿真课设模板.doc
  5. mysql触发器联机删除_mysql触发器删除实例1
  6. python 移动文件或文件夹操作
  7. gitlab安装注册记录——gitlab(一)
  8. 服贸会 | 神州信息:5代ModelB@nk伴随银行业科技创新发展
  9. MySQL — 数据库的基本概念、安装并配置MySQL、MySQL的基本使用、在项目中操作MySQL、前后端的身份认证
  10. Pwnginx – a nginx backdoor offering shell
  11. LeetCode - 1002 - 查找常用字符(find-common-characters)
  12. 惊喜!网易自媒体一星开通收益!
  13. 生化危机5:惩罚 感
  14. 怎样制定自己的职业规划
  15. 5-Redis 高可用篇:你管这叫 Sentinel 哨兵集群原理(码哥)
  16. 情感分类---未解决
  17. 近年来火热软件有哪些创意
  18. Tensorflow计算一个模型的浮点运算数
  19. jQuery对于FireBox中的keypress与event
  20. http://ticktick.blog.51cto.com/823160/431329

热门文章

  1. php的service层和logic层,mvc深刻理解,logic,service,model层的作用
  2. c语言struct的作用和用法,c语言中的关键字struct(结构体)的用法
  3. 面试官问你关于node的那些事(基础篇)
  4. android取图片颜色代码,Android Palette 提取图片的主色调
  5. be delegated to target bean. Switch its visibility to package or protected.
  6. P2V过程中问题解决方法小结
  7. javascript 关闭浏览器怎么清空所有的cookie
  8. 一帘幽梦——培养优秀
  9. ORB_SLAM错误总结
  10. viewpager嵌套viewpager