蓝桥杯.蚂蚁感冒(模拟)
Question:
Solve:
当想不到办法的时候,暴力模拟就是最好的办法~
既然是要走杆,那就一步一步走,一步一步的判断,等蚂蚁全部出界之后再统计一下有多少感染就行,这个思路非常平易近人
接下来明确一些关键点:
1. 能够相撞造成反向的其实只有一种情况:
也就是说只有后一只蚂蚁向左走(-),前一只蚂蚁向右走(+),而且当前时间点二者距离小于等于 2 的情况下,下一时间点才会相撞
2. 等效替代
二者相碰之后反向,其实可以看作二者穿过对方继续行走,并没有什么影响:
二者均未感冒,相撞仍未感冒;均感冒,相撞仍是均感冒
二者中有一只感冒,相撞后二者皆感冒
不管是否反向,二者一共走过的位置点不会变 ,没有必要去模拟反向
明确这两点之后,就可以进行模拟了,剩下还有几个注意点:
1. 出界判断,走完杆子的蚂蚁自然就不用管它会不会感冒了,所以我定义了一个vis1数组去标记是否出界
2. 每一步的模拟需要按位置顺序从前到后判断,所以我定义了一个结构体,并且重载运算符(按pos的绝对值排序)
3. 排序过程是走每一步都要排序一次,有点恢复出厂设置那意思
4. 因为蚂蚁的位置分布可能会比较密集,比如位置3 和位置 4 都有一只正向蚂蚁,位置 5 有一只反向蚂蚁
这时候我就不能只检测位置 5 和位置 4 的蚂蚁是否会相撞,需要一次性将位置 3 和位置 4 的蚂蚁都与位置 5 的蚂蚁进行判断,否则就会遗漏,所以我的代码出现了一段复写,不过直接CV该参数就行
Code:
#include <bits/stdc++.h>
using namespace std;
int n, cnt = 0;
bool vis1[55]; //标记是否走出杆子
//绝对值函数
int f(int x) { return x < 0 ? -x : x; }
struct Node{int pos; //存放当前位置bool vis; //标记是否感染bool operator < (const Node & a)const{return f(pos) < f(a.pos);}
}a[55];
int main(void)
{//初始化memset(vis1, false, sizeof(vis1));scanf("%d", &n);for(int i = 1; i <= n; i++){scanf("%d", &a[i].pos);a[i].vis = false;}a[1].vis = true;sort(a+1, a+1+n);//模拟while(cnt != n){for(int i = 1; i <= n; i++){//已经出杆,跳过if(vis1[i]) continue;a[i].pos++; //移动//感冒检测if( f(f(a[i-1].pos) - f(a[i].pos)) <= 2 && a[i].pos < 0 && a[i-1].pos > 0 && (a[i].vis || a[i-1].vis))a[i-1].vis = a[i].vis = true;if( f(f(a[i-2].pos) - f(a[i].pos)) <= 2 && a[i].pos < 0 && a[i-2].pos > 0 && (a[i].vis || a[i-2].vis))a[i-2].vis = a[i].vis = true;//结束判断if(a[i].pos == 0 || a[i].pos == 100)vis1[i] = true,cnt++;}sort(a+1,a+1+n);}//输出结果int res = 0;for(int i = 1; i <= n; i++)if(a[i].vis) res++;cout <<res <<endl;return 0;
}
最后附上蓝桥杯汇总链接:蓝桥杯C/C++A组省赛历年真题题解
声明:图片均来源于蓝桥杯官网,以个人刷题整理为目的,如若侵权,请联系删除~
蓝桥杯.蚂蚁感冒(模拟)相关推荐
- [蓝桥杯] 蚂蚁感冒
[蓝桥杯] 蚂蚁感冒 峰值内存消耗 < 256M CPU消耗 < 1000ms [题目描述 - Problem Description] 长100厘米的细长直杆子上有n只蚂蚁.它们的头有 ...
- 蓝桥杯 蚂蚁感冒 不要模拟!
蚂蚁感冒 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 长100厘米的细长直杆子上有n只蚂蚁.它们的头有的朝左,有的朝右. 每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/ ...
- 有意思的逻辑思维题(三)(hdu2211,蓝桥杯蚂蚁感冒)
杀人游戏 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2211 题目描述: 现在已知有N个土匪站在一排,每个土匪都有一个编号,从1到N,每次杀人时给 ...
- java 蓝桥杯 蚂蚁感冒
问题描述 长100厘米的细长直杆子上有n只蚂蚁.它们的头有的朝左,有的朝右. 每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒. 当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行. 这些蚂蚁中,有1只蚂 ...
- 蓝桥杯 蚂蚁感冒(Java)
解题思路:根据第一个感冒蚂蚁的行驶方向,分为两种情况(向左,右),如果他朝右走,则在他右边有朝左走的蚂蚁必然都会被传染(如果右边没有向左的蚂蚁,则不会有蚂蚁被传染,直接输出结果),此时在它右边的不必再 ...
- 第十四届蓝桥杯第三期模拟赛 C/C++ B组 原题与详解
本篇文章对第十四届蓝桥杯第三期模拟赛所有的题目进行了详细解析.如果大家还想刷题的话,我给大家整理出了第十二届的省赛真题:第十二届省赛C/C++ B组真题.推荐大家可以去做一下. 文章目录 一.填空题 ...
- 第十四届蓝桥杯第一期模拟赛试题与题解 C++
第十四届蓝桥杯第一期模拟赛试题与题解 C++ 试题 A 题解:位运算 试题 B 题解:日历模拟 试题 C 题解:double 求和 试题 D 题解:枚举 试题 E 题解:二维前缀和 试题 F 题解:两 ...
- 第十四届蓝桥杯第二期模拟赛 【python】
第十四届蓝桥杯第二期模拟赛 [python] 文章目录 第十四届蓝桥杯第二期模拟赛 [python] ✨最小的2022 (python二进制) ❓️问题描述 答案提交
- 蓝桥杯|2021第十二届蓝桥杯第二次模拟赛真题与解答[Java]
记录2021年第十二届蓝桥杯第二次模拟赛真题与解题,部分答案来自网络.个人记录,菜得很. 目录 填空题 一 二 三 四 五 编程题 六 七 八 九 十 填空题 一 问题描述 请问在 1 到 2020 ...
最新文章
- 键盘各个键对应的ASCLL值
- 远程访问rest方式
- 28岁程序员狂赚上亿宣布退休,网友:这就是命!
- 离职交接文档_离职程序员交接工作被同事怒怼:每一行代码都讲清楚,不然投诉你...
- jtoken判断是否包含键_Redis源码解析十三--有序集合类型键实现(t_zset)
- 联想陈旭东:我们有工匠精神
- 成立两年估值17亿美元,这家Hinton点赞的AI芯片公司获宝马微软投资
- linux中断处理程序架构,Linux外部中断架构初始化流程-----Tiny6410
- WebLogic(12C)——windows下安装教程
- 如何解决logcat TAG过长时Android studio提示错误的问题
- 概率论--Z=X+Y概率密度的推导
- 无法删除文件 无法读取源文件或磁盘_U盘损坏“无法读取文件”不要慌,教你一招马上回血复活...
- 论软件设计模式及其应用
- 2021年12月大学英语六级作文
- 这可能是学日语最好的几个App
- mysql no database selected_数据库中出现no database selected是什么意思?
- 墨画子卿第三章第5节:飞过去的是胧月
- flutter clean
- win10使用docker搭建jenkins,实现自动化部署
- VirtualBox安装虚拟机并为其装系统