蓝桥杯2024年第十五届省赛真题-蓝桥村的真相

题目描述

在风景如画的蓝桥村,n 名村民围坐在一张古老的圆桌旁,参与一场思想的较量。这些村民,每一位都有着鲜明的身份:要么是誉满乡野的诚实者,要么是无可救药的说谎者。当会议的钟声敲响,一场关于真理与谬误的辩论随之展开。每位村民轮流发言,编号为 i 的村民提出了这样的断言:坐在他之后的两位村民——也就是编号 i + 1 和 i + 2(注意,编号是环形的,所以如果 i 是最后一个,则 i + 1 是第一个,以此类推)之中,一个说的是真话,而另一个说的是假话。在所有摇曳不定的陈述中,有多少真言隐藏在谎言的面纱之后?

请你探索每一种可能的真假排列组合,并计算在所有可能的真假组合中,说谎者的总数。

输入格式

输入的第一行包含一个整数 T,表示每次输入包含 T 组数据。

接下来依次描述 T 组数据。

每个数据一行包含一个整数 n,表示村落的人数。

输出格式

输出 T 行,每行包含一个整数,依次表示每组数据的答案。

样例输入

2
3
3

样例输出

6
6

提示

【样例说明】

在样例中,可能的组合有「假,假,假」「真,真,假」「真,假,真」「假,真,真」,说谎者的总数为 3 + 1 + 1 + 1 = 6。

【评测用例规模与约定】

对于 10% 的评测用例,T = 1,3 ≤ n ≤ 10。

对于 40% 的评测用例,1 ≤ T ≤ 102,3 ≤ n ≤ 3 × 103。

对于所有评测用例,1 ≤ T ≤ 105,3 ≤ n ≤ 1018。

解题思路

  假设 1为真话 0为假话。
  若 第i个村民为1  则后面两位为01或10;
  若 第i个村民为0  则后面两位为00或11;

第一个为1 则他说的是真话 字符串应该为101或110,

若字符串为101 第二位为0 则第三四位应该为1 字符串为1011,
第三位为1 则 第4,5 位分别为1,0 或1,1

因为第4位为1 第5位为0 字符串应为10110,
以此类推 101101 1011011 10110110 1011011011 
可以发现出现101字符串循环
若字符串为110 由上面类推则获得 110 循环
第一个为0 则他说的是假话 字符串应为 011 或 000

若为011
011        

0110  

011011

0110110

011011011

出现 011循环

同理 若为000
00000000000000000000000000000000 无限0循环
※题目不需要生成字符串,只需要统计0的个数
统计可能说谎者的总数 就是统计每种可能中 0 出现的次数
101循环中 每三个字符出现一次0  n/3
110循环同上                              n/3
011循环同上                              n/3
0循环每个字符都是0                     n

将所有情况相加 结果为2n
※由于需要首尾相连 则101 110 011循环在 n%3!=0时 不符合条件  只有n次

代码

import sys
input = sys.stdin.read
data = input().split()

T = int(data[0])
results = []

for i in range(1, T + 1):
    n = int(data[i])
    if n % 3 == 0:
        results.append(str(2 * n))
    else:
        results.append(str(n))

sys.stdout.write("\n".join(results) + "\n")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值