1.1.5 蚂蚁。一根长度为L厘米的木棍上有n只蚂蚁,每只蚂蚁要么朝左爬,要么朝右爬,速度为1厘米/秒。
蚂蚁
题目来源 :《算法竞赛入门经典——训练指南》/刘汝佳,陈锋编著
一根长度为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;
}
总结
- 所有蚂蚁的相对位置保持不变, 在不掉下木板的情况下, 所有的蚂蚁都可以看成是"往复运动"
- 朝向某方向蚂蚁的个数不变, 也就是说, 原来有2只朝右2只朝左的蚂蚁, 碰撞过后还是有2只朝右2只朝左的蚂蚁
- 蚂蚁碰撞的时候可以看成"对穿而过", 我们可以由此找出每个蚂蚁最终的位置和朝向(而不用在意是哪一只蚂蚁)
- 我们的逻辑是"知道最后一定会有蚂蚁在这个位置, 再去找应该在这个位置的蚂蚁", 而不是"由蚂蚁计算它最后的位置"
- 找到了"应该在这个位置的蚂蚁"之后, 这个蚂蚁的方向也就确定了(方向在第3步得出)
- 另外, 我们可以根据输入顺序给蚂蚁加一个标签(id), 来在最后的结果中选择输出
- 在结构体中重载了<以排序
- dirName 与 蚂蚁的 d + 1 相对应 便于输出
- 使用0/1/-1代表蚂蚁状态
1.1.5 蚂蚁。一根长度为L厘米的木棍上有n只蚂蚁,每只蚂蚁要么朝左爬,要么朝右爬,速度为1厘米/秒。相关推荐
- 【题目】一根长度为M厘米的木棍上有n只蚂蚁,每只蚂蚁要么朝左爬,要么朝右爬,速度为每秒1厘米。当两只蚂蚁对撞时,二者同时掉头(掉头时间忽略不计)。给出每只蚂蚁的初始位置和朝向,计算T秒后每只蚂蚁的位置
文件名:[作业] 作者:〈漆黑〉 描述:〈 一根长度为M厘米的木棍上有n只蚂蚁,每只蚂蚁要么朝左爬,要么朝右爬,速度为每秒1厘米.当两只蚂蚁对撞时,二者同时掉头(掉头时间忽略不计).给出每只蚂蚁的初始 ...
- [经典面试题][百度]数轴上从左到右有n各点a[0], a[1], ……,a[n -1],给定一根长度为L的绳子,求绳子最多能覆盖其中的几个点。...
题目 数轴上从左到右有n各点a[0], a[1], --,a[n -1],给定一根长度为L的绳子,求绳子最多能覆盖其中的几个点. 思路一 遍历所有区间跟绳子L比较. i遍历区间起点,j遍历区间终点. ...
- 木棍上的蚂蚁jolj2466 模拟法
一根长度为C厘米的木棍上有n只蚂蚁,每只蚂蚁要么朝左爬,要么朝右爬,速度为1厘米/秒.当两只蚂蚁相撞时,二者同时掉头(掉头时间忽略不计).给出每只蚂蚁的初始位置和朝向,计算T秒之后每只蚂蚁的位置. 输 ...
- 《庄子》中说到,“一尺之棰,日取其半,万世不竭”。第一天有一根长度为 a的木棍,从第二天开始,每天都要将这根木棍锯掉一半
26,<庄子>中说到,"一尺之棰,日取其半,万世不竭".第一天有一根长度为 a的木棍,从第二天开始,每天都要将这根木棍锯掉一半 (每次除 2,向下取整).第几天的时候木 ...
- 剑指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段绳子的长度乘积最大为多少? ...
- 给你一根长度为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]可能的最大乘积是多少? ...
- 标题:蚂蚁感冒 长100厘米的细长直杆子上有n只蚂蚁。它们的头有的朝左,有的朝右。 每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒。 当两只蚂蚁碰面时,它们会同时掉头
标题:蚂蚁感冒 长100厘米的细长直杆子上有n只蚂蚁.它们的头有的朝左,有的朝右. 每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒.当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行.这些蚂蚁中,有1只 ...
- HDU 2243 考研路茫茫——单词情结 求长度小于等于L的通路总数的方法
http://acm.hdu.edu.cn/showproblem.php?pid=2243 这是一题AC自动机 + 矩阵快速幂的题目, 首先知道总答案应该是26^1 + 26^2 + 26^3 .. ...
- 设有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 ...
最新文章
- 使用javax.tools.JavaCompiler根据字符串内容动态生成新的Java类并编译成.class
- Burp Suite Scanner Module - 扫描模块
- Atitit 调用另外语言的功能 目录 1. Waht 常见的语言java python js sql xml h5 c# php等之间的互相调用	1 2. 为什么需要互相调用why	1 3. 常
- 数字通信计算机仿真问题汇总,燕山大学数字通信计算机仿真课设模板.doc
- mysql触发器联机删除_mysql触发器删除实例1
- python 移动文件或文件夹操作
- gitlab安装注册记录——gitlab(一)
- 服贸会 | 神州信息:5代ModelB@nk伴随银行业科技创新发展
- MySQL — 数据库的基本概念、安装并配置MySQL、MySQL的基本使用、在项目中操作MySQL、前后端的身份认证
- Pwnginx – a nginx backdoor offering shell
- LeetCode - 1002 - 查找常用字符(find-common-characters)
- 惊喜!网易自媒体一星开通收益!
- 生化危机5:惩罚 感
- 怎样制定自己的职业规划
- 5-Redis 高可用篇:你管这叫 Sentinel 哨兵集群原理(码哥)
- 情感分类---未解决
- 近年来火热软件有哪些创意
- Tensorflow计算一个模型的浮点运算数
- jQuery对于FireBox中的keypress与event
- http://ticktick.blog.51cto.com/823160/431329
热门文章
- php的service层和logic层,mvc深刻理解,logic,service,model层的作用
- c语言struct的作用和用法,c语言中的关键字struct(结构体)的用法
- 面试官问你关于node的那些事(基础篇)
- android取图片颜色代码,Android Palette 提取图片的主色调
- be delegated to target bean. Switch its visibility to package or protected.
- P2V过程中问题解决方法小结
- javascript 关闭浏览器怎么清空所有的cookie
- 一帘幽梦——培养优秀
- ORB_SLAM错误总结
- viewpager嵌套viewpager