蓝桥杯 PREV27 蚂蚁感冒

news/2024/7/1 22:01:36 标签: 蓝桥杯, PREV27, 蚂蚁感冒

PREV27__0">蓝桥杯 PREV27 蚂蚁感冒

问题描述

长100厘米的细长直杆子上有n只蚂蚁。它们的头有的朝左,有的朝右。每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒。当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。这些蚂蚁中,有1只蚂蚁感冒了。并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。

输入格式
第一行输入一个整数n (1 < n < 50), 表示蚂蚁的总数。接着的一行是n个用空格分开的整数 Xi (-100 < Xi < 100), Xi的绝对值,表示蚂蚁离开杆子左边端点的距离。正值表示头朝右,负值表示头朝左,数据中不会出现0值,也不会出现两只蚂蚁占用同一位置。其中,第一个数据代表的蚂蚁感冒了。
输出格式
要求输出1个整数,表示最后感冒蚂蚁的数目。
样例输入
3 5 -2 8
样例输出
1
样例输入
5 -10 8 -20 12 25
样例输出
3

思路解析
  • 解法一:暴力模拟
if __name__ == '__main__':
    N = int(input())  # 蚂蚁数量
    ants = [int(temp) for temp in input().strip().split()]  # 存储各蚂蚁位置
    ants_cold = [False for i in range(len(ants))]  # 标识蚂蚁是否感冒
    ants_cold[0] = True  # 第一个蚂蚁感冒

    while True:
        # 蚂蚁行进
        for i in range(len(ants)):
            if 0 < abs(ants[i]) < 100:
                ants[i] += 1
            else:
                continue

        # 蚂蚁碰面
        for i in range(len(ants)):
            if abs(ants[i]) == 0 or abs(ants[i]) == 100:
                continue
            for j in range(i + 1, len(ants)):
                if abs(ants[i]) == abs(ants[j]):
                    if i == 0:
                        ants_cold[j] = True
                    ants[i] *= -1
                    ants[j] *= -1

        # 蚂蚁是否全部爬离杆子
        count = 0
        for i in range(len(ants)):
            if abs(ants[i]) <= 0 or abs(ants[i]) >= 100:
                count += 1
        if count == len(ants):
            break

    # 统计感冒蚂蚁数量
    cold_number = 0
    for temp in ants_cold:
        if temp is True:
            cold_number += 1
    print(cold_number)
  • 解法二:

    蚂蚁碰面掉头在不考虑蚂蚁个体的情况下实际上对问题没什么影响,总体的运动不变。

    以感冒的蚂蚁为中心,蚂蚁们可以分为四类,一类在感冒蚂蚁左边往右走 l r lr lr;一类在感冒蚂蚁左边往左走 l l ll ll;一类在感冒蚂蚁右边往左走 r l rl rl;一类在感冒蚂蚁右边往右走 r r rr rr

    当感冒蚂蚁往左走时,会传染的有 l r lr lr,而 l r lr lr传染 r l rl rl,故感冒蚂蚁总数为 l r + r l + 1 lr+rl+1 lr+rl+1

    当感冒蚂蚁往右走时,会传染的有 r l rl rl,而 r l rl rl传染 l r lr lr,故感冒蚂蚁总数为 r l + l r + 1 rl+lr+1 rl+lr+1

#include<iostream>
#include<cmath>

using namespace std;

int main() {
	int n, cold, t, lr = 0, ll = 0, rr = 0, rl = 0, ans;
	cin >> n >> cold;
	for (int i = 0; i < n - 1; i++) {
		cin >> t;

		int pos_cold = abs(cold);
		int pos = abs(t);

		if (t > 0) {
			if (pos < pos_cold) lr++;
			else rr++;
		}
		else {
			if (pos < pos_cold) ll++;
			else rl++;
		}
		if (cold < 0) {
			if (lr > 0) ans = lr + rl + 1;
		}
		else {
			if (rl > 0) ans = rl + lr + 1;
		}
		cout << ans;
		return 0;
	}
}

上述的解法可以更简洁一些:

#include<iostream>
#include<cmath>

using namespace std;

int main() {
	int n, cold, t, lr = 0, ll = 0, rr = 0, rl = 0, ans = 1;
	cin >> n >> cold;
	for (int i = 0; i < n - 1; i++) {
		cin >> t;

		int pos_cold = abs(cold);
		int pos = abs(t);

		if (t > 0) {
			if (pos < pos_cold) lr++;
		}
		else {
			if (pos > pos_cold) rl++;
		}
	}
	if ((cold < 0 && lr > 0) || (cold > 0 && rl > 0)) {
		ans = lr + rl + 1;
	}

	cout << ans;
	return 0;
}

http://www.niftyadmin.cn/n/1051155.html

相关文章

使用BouncyCastleProvider类报错:JCE cannot authenticate the provider BC

java.lang.SecurityException: JCE cannot authenticate the provider BC 当出现这个错误&#xff0c;网上一般都是要修改jre/lib/sercure下的文件的&#xff0c;这个太麻烦了。问题的根源并不是jre的错&#xff0c;因此没必要这么搞。 出现这个错误&#xff0c;是因为jar包的…

Hibernate中 一 二级缓存及查询缓存的学习总结

最近趁有空学习了一下Hibernate的缓存&#xff0c;其包括一级缓存&#xff0c;二级缓存和查询缓存&#xff08;有些是参照网络资源的&#xff09;&#xff1a;一、一级缓存 一级缓存的生命周期和session的生命周期一致&#xff0c;当前sessioin一旦关闭&#xff0c;一级缓存…

蓝桥杯 PREV-8 买不到的数目

蓝桥杯 PREV-8 买不到的数目 问题描述 小明开了一家糖果店。他别出心裁&#xff1a;把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。 小朋友来买糖的时候&#xff0c;他就用这两种包装来组合。当然有些糖果数目是无法组合出来的&#xff0c;比如要买 10 颗糖。 你可以…

WPF Path实现虚线流动效果

WPF Path实现虚线流动效果 原文:WPF Path实现虚线流动效果最近闲来无事&#xff0c;每天上上网&#xff0c;看看博客生活也过得惬意&#xff0c;这下老总看不过去了&#xff0c;给我一个任务&#xff0c;叫我用WPF实现虚线流动效果&#xff0c;我想想&#xff0c;不就是虚线流动…

java 版百度网盘功能

java 版百度网盘功能&#xff0c;目前已经实现&#xff1a; 1&#xff1a;百度网盘登录 2&#xff1a;列出百度网盘文件 3: 切换目录 4: 多线程下载文件 速度有待优化。思路已经成型。 源码地址&#xff1a;https://gitee.com/ffch/BaiduPcs ###命令行使用&#xff1a;…

Hibernate 缓存问题

今天做项目的时候&#xff0c;碰到了一个Hibernate二级缓存的问题。 在进行一个更新操作后&#xff0c;再想从数据库里取东西就会出现NullPointerException。相当郁闷&#xff0c;明明那个对象有封装了那个id。可是就是取不出来&#xff0c;开始以为是mapping的问题&#xff0c…

蓝桥杯 PREV6 翻硬币

蓝桥杯 PREV6 翻硬币 问题描述 小明正在玩一个“翻硬币”的游戏。桌上放着排成一排的若干硬币。我们用 * 表示正面&#xff0c;用 o 表示反面&#xff08;是小写字母&#xff0c;不是零&#xff09;。比如&#xff0c;可能情形是&#xff1a;oo*oooo 如果同时翻转左边的两个硬…

日期随笔,目录

2018.9.03&#xff1a; 1.粒度 2018.9.09&#xff1a; 1.uvision编写汇编无法调试&#xff0c;加链接脚本 2.stmfd:满减栈&#xff0c;stmfa:满增栈&#xff1b;stmed&#xff1a;空减栈&#xff0c;stmea:空增栈 转载于:https://www.cnblogs.com/jiaan/p/9577463.html