python模拟练习第二期

目录

问题一

问题二

问题三

问题四

问题五

问题六

问题七

问题八

问题九

问题十


 

问题一1.如果一个数 p 是个质数,同时又是整数 a 的约数,则 p 称为 a 的一个质因数。

请问, 2024 的最大的质因数是多少?

由于问题相同,​结果参考第一期第一期https://blog.youkuaiyun.com/m0_74473137/article/details/143732081?spm=1001.2014.3001.5501

问题二
2.两个数按位异或是指将这两个数转换成二进制后,最低位与最低位异或作为结果的最低位,次低位与次低位异或作为结果的次低位,以此类推。

对于两个整数 a, b,既是 a 的整数倍又是 b 的整数倍的数称为 a 和 b 的公倍数。公倍数中最小的正整数称为 a 和 b 的最小公倍数。

请问, 2024 和 1024 的最小公倍数是多少?

最小公倍数和最大公约数之间有一个重要的关系:

LCM(a,b)=(∣a×b∣)/GCD(a,b)​

因此,首先需要计算 2024 和 1024 的最大公约数。

1求最大公约数 (GCD)

我们可以使用 辗转相除法 来计算 GCD。

用 2024 除以 1024,得到商 1,余数为 2024−1024=10002024−1024=1000。

然后用 1024 除以 1000,得到商 1,余数为 1024−1000=241024−1000=24。

接下来,用 1000 除以 24,得到商 41,余数为 1000−41×24=161000−41×24=16。

然后用 24 除以 16,得到商 1,余数为 24−16=824−16=8。

接着,用 16 除以 8,得到商 2,余数为 0。

当余数为 0 时,最后一个非零余数(即 8)就是 GCD(2024, 1024)。

所以,GCD(2024, 1024) = 8。

 2: 计算最小公倍数

根据公式:

LCM(2024,1024)=(∣2024×1024∣)/GCD(2024,1024)=(2024×1024)/8

先计算 2024×1024:

2024×1024=2072576

然后计算:

2072576/8=259072

3.最小公倍数

因此,2024 和 1024 的最小公倍数是 259072

import math
print(2024*1024//math.gcd(2024, 1024))


问题三
3.例如,3 与 5 按位异或值为 6 。

请问,有多少个不超过 2024 的正整数,与 2024 异或后结果小于 2024 。

n = 2024
res = 0
for i in range(1, n+1):
    if i ^ n < n:
        res += 1
print(res)

问题四
4.小蓝有一个整数,初始值为 1 ,他可以花费一些代价对这个整数进行变换。

小蓝可以花费 1 的代价将整数增加 1 。

小蓝可以花费 3 的代价将整数增加一个值,这个值是整数的数位中最大的那个(1 到 9)。

小蓝可以花费 10 的代价将整数变为原来的 2 倍。

例如,如果整数为 16,花费 3 将整数变为 22 。

又如,如果整数为 22,花费 1 将整数变为 23 。

又如,如果整数为 23,花费 10 将整数变为 46 。

请问,如果要将整数从初始值 1 变为 2024,请问最少需要多少代价?

def min_cost_to_2024():
    target = 2024
    
    # dp数组,dp[x] 表示从1到x的最小代价
    dp = [float('inf')] * (target + 1)
    dp[1] = 0  
    
    for x in range(1, target + 1):
        if x + 1 <= target:
            dp[x + 1] = min(dp[x + 1], dp[x] + 1)

        max_digit = max(map(int, str(x))) 
        if x + max_digit <= target:
            dp[x + max_digit] = min(dp[x + max_digit], dp[x] + 3)
        
        if x * 2 <= target:
            dp[x * 2] = min(dp[x * 2], dp[x] + 10)
    
    return dp[target]
result = min_cost_to_2024()
print(result)

问题五
5.小蓝有以下 100 个整数:

534, 386, 319, 692, 169, 338, 521, 713, 640, 692, 969, 362, 311, 349, 308, 357, 515, 140, 591, 216,

57, 252, 575, 630, 95, 274, 328, 614, 18, 605, 17, 980, 166, 112, 997, 37, 584, 64, 442, 495,

821, 459, 453, 597, 187, 734, 827, 950, 679, 78, 769, 661, 452, 983, 356, 217, 394, 342, 697, 878,

475, 250, 468, 33, 966, 742, 436, 343, 255, 944, 588, 734, 540, 508, 779, 881, 153, 928, 764, 703,

459, 840, 949, 500, 648, 163, 547, 780, 749, 132, 546, 199, 701, 448, 265, 263, 87, 45, 828, 634.

小蓝想从中选出一部分数求和,使得和是 24 的倍数,请问这个和最大是多少?
 

numbers = [
    534, 386, 319, 692, 169, 338, 521, 713, 640, 692, 969, 362, 311, 349, 308, 357, 515, 140, 591, 216,
    57, 252, 575, 630, 95, 274, 328, 614, 18, 605, 17, 980, 166, 112, 997, 37, 584, 64, 442, 495,
    821, 459, 453, 597, 187, 734, 827, 950, 679, 78, 769, 661, 452, 983, 356, 217, 394, 342, 697, 878,
    475, 250, 468, 33, 966, 742, 436, 343, 255, 944, 588, 734, 540, 508, 779, 881, 153, 928, 764, 703,
    459, 840, 949, 500, 648, 163, 547, 780, 749, 132, 546, 199, 701, 448, 265, 263, 87, 45, 828, 634
]

dp = [-float('inf')] * 24
dp[0] = 0  

for num in numbers:
    # 临时存储当前状态的dp数组
    new_dp = dp[:]
    for i in range(24):
        new_sum = dp[i] + num
        new_dp[(i + num) % 24] = max(new_dp[(i + num) % 24], new_sum)
    dp = new_dp

# 结果是dp[0],因为dp[0]表示和是24的倍数的最大值
print(dp[0])

问题六
6.小蓝准备请自己的朋友吃饭。小蓝朋友很多,最终吃饭的人总数达 2024 人(包括他自己)。

请问如果每桌最多坐 n 人,最少要多少桌才能保证每个人都能吃饭。

【输入格式】 输入一行包含一个整数 n 。

【输出格式】 输出一行包含一个整数,表示最少的桌数。

【样例输入】 10

【样例输出】 203

【样例输入】 8

【样例输出】 253

解释

如果 2024n 完全整除,那么桌数就是 2024 / n。如果不能整除,那么需要多一张桌子来容纳剩下的人。

数学表达式

最少桌数可以通过向上取整来求得:

桌数=⌈2024/n⌉

这意味着总桌数是 2024 / n 的向上取整值,即:

桌数=(2024+n−1)/n​

n = int(input())

tables = (2024 + n - 1) // n

print(tables)

问题七
7.小蓝有一个数组 a[1], a[2], ..., a[n] ,请求出数组中值最小的偶数,输出这个值。

【输入格式】 输入的第一行包含一个整数 n 。

第二行包含 n 个整数,相邻数之间使用一个空格分隔,依次表示 a[1], a[2], ..., a[n] 。

【输出格式】 输出一行,包含一个整数,表示答案。数据保证数组中至少有一个偶数。

【样例输入】

9
9 9 8 2 4 4 3 5 3
【样例输出】
2

n = int(input())  
a = list(map(int, input().split()))  

min_even = float('inf')

for num in a:
    if num % 2 == 0:
        min_even = min(min_even, num)

print(min_even)

问题八
8.一个字符串包含LANQIAO是指在字符串中能取出几个字符,将他们按照在原串中的位置顺序摆成一排后字符串为 LANQIAO 。即字符串包含 LANQIAO 是指 LANQIAO 是这个串的子序列。

例如:LLLLLANHAHAHAQLANIIIIALANO 中包含 LANQIAO 。

又如:OAIQNAL 中不包含 LANQIAO 。

给点一个字符串,判断字符串中是否包含 LANQIAO 。

【输入格式】 输入一行包含一个字符串。

【输出格式】 如果包含 LANQIAO ,输出一个英文单词 YES ,否则输出一个英文单词 NO 。

【样例输入】
LLLLLANHAHAHAQLANIIIIALANO
【样例输出】
YES

n = input()  
target = 'LANQIAO'  
target_len = len(target)
i = 0 


for char in n:
    if char == target[i]:  
        i += 1 
    if i == target_len:  
        print('YES')
        break
else:
    print('NO')

问题九
9.小蓝有一个 n 行 m 列的矩阵 a[i][j] ,他想在矩阵中找出一个“口”字形状的区域,使得区域上的值的和最大。

具体讲,一个“口”字形状的区域可以由两个坐标 (x1, y1) 和 (x2, y2) 确定,满足:

1 <= x1 < x2 <= n ; 1 <= y1 < y2 <= m ; x2 - x1 = y2 - y1 。 对应的区域由满足以下条件之一的点 (x, y) 构成:

x1 <= x <= x2,且 y = y1 ,对应“口”的左边一竖; y1 <= y <= y2,且 x = x1 ,对应“口”的上面一横; x1 <= x <= x2,且 y = y2 ,对应“口”的右边一竖; y1 <= y <= y2,且 x = x2 ,对应“口”的下面一横。 请注意有些点满足以上条件的多个,例如左上角的点 (x1, y1) ,在计算时算为一个点。

区域上的值是指对应区域的所有点的值,即“口”字的框上的值,不含框内和框外的值。

【输入格式】 输入的第一行包含两个整数 n, m ,分别表示行数和列数。

接下来 n 行,每行包含 m 个整数,相邻数之间使用一个空格分隔,依次表示矩阵的每行每列的值,本部分的第 i 行第 j 列表示 a[i][j] 。

【输出格式】 输出一行包含一个整数,表示最大的和。

【样例输入】
5 6
1 -1 2 -2 3 -3
-1 2 -2 3 -3 4
2 -2 3 -3 4 -4
-2 3 -3 4 -4 5
3 -3 4 -4 5 -5

【样例输出】
4

n, m = map(int, input().split())  
a = [list(map(int, input().split())) for _ in range(n)]  

ans = 0  

# 双重循环遍历矩形的左上角 (x1, y1)
for x1 in range(n - 1):
    for y1 in range(m - 1):
        # 计算最大边长L
        L = min(n - x1, m - y1)
        # 对每一个边长k进行遍历
        for k in range(1, L):
            x2 = x1 + k  # 右下角的 x 坐标
            y2 = y1 + k  # 右下角的 y 坐标
            s = 0  # 初始化和为0

            # 计算左边和右边两条边的和
            for t in range(x1, x2 + 1):
                s += a[t][y1]  # 加上左边的元素
                s += a[t][y2]  # 加上右边的元素

            # 计算上边和下边两条边的和
            for t in range(y1, y2 + 1):
                s += a[x1][t]  # 加上上边的元素
                s += a[x2][t]  # 加上下边的元素

            # 减去四个重复计算的角落点
            s -= a[x1][y1]
            s -= a[x1][y2]
            s -= a[x2][y1]
            s -= a[x2][y2]

            ans = max(ans, s)

print(ans)

问题十
10. 小蓝正在玩一个寻宝游戏。寻宝游戏在一个方格图上进行。方格图中的每一个格子都有一个坐标 (r, c),其中越往北 r 越小,越往南 r 越大,越往东 c 越大,越往西 c 越小。南北相邻方格的 c 坐标相同,r 坐标差一。东西相邻方格的 r 坐标相同, c 坐标差一。

游戏开始时,小蓝站在 (0, 0) 处,面向北边。游戏区域无限大,且没有障碍。每一步,小蓝控制自己的角色走一步,他可以有如下三种选择:

向前走:朝现在的方向前进到相邻的方格中,并保持当前的方向。 向左走:向左转90度,并前进到相邻的方格中(即进入到原来左边的方格),面向的方向变为了原来的左边。 向右走:向右转90度,并前进到相邻的方格中(即进入到原来右边的方格),面向的方向变为了原来的右边。 小蓝玩了一会儿,一共走了 n 步,他记录了自己的每一个动作。但是他没有找到宝藏。他怀疑前面的某一步出现了失误。他想知道,如果他改变之前的某一步,能到的位置有哪些。由于这个太复杂,他想知道最终到的位置(第 n 步后到的位置)有多少种。

【输入格式】 输入的第一行包含一个整数 n ,表示小蓝走了 n 步。

第二行包含一个长度为 n 的由大写字母组成的字符串,依次表示小蓝走的每一步。字母 F 、 L 、 R 分别表示对应的步是向前走、向左走、向右走。

【输出格式】 输出一行,包含一个整数,表示如果改变某一步,可以到的位置的种类数。

【样例输入】

3
FLR

【样例输出】

6

【样例说明】 如果不改变,三步依次走到:(-1, 0), (-1, -1), (-2, -1) ,最终位置为 (-2, -1) 。

如果第一步改成 L,三步依次走到:(0, -1), (1, -1), (1, -2) ,最终位置为 (1, -2) 。

如果第一步改成 R,三步依次走到:(0, 1), (-1, 1), (-1, 2) ,最终位置为 (-1, 2) 。

如果第二步改成 F,三步依次走到:(-1, 0), (-2, 0), (-2, 1) ,最终位置为 (-2, 1) 。

如果第二步改成 R,三步依次走到:(-1, 0), (-1, 1), (0, 1) ,最终位置为 (0, 1) 。

如果第三步改成 F,三步依次走到:(-1, 0), (-1, -1), (-1, -2) ,最终位置为 (-1, -2) 。

如果第三步改成 L,三步依次走到:(-1, 0), (-1, -1), (0, -1) ,最终位置为 (0, -1) 。

共有 6 种不同的最终位置。

【样例输入】
4
RRRR
【样例输出】
6

【样例说明】 有 8 种改变方法:

改为 FRRR ,最终位置为 (0, 0);

改为 LRRR ,最终位置为 (0, 0);

改为 RFRR ,最终位置为 (1, 1);

改为 RLRR ,最终位置为 (0, 2);

改为 RRFR ,最终位置为 (2, 0);

改为 RRLR ,最终位置为 (2, 2);

改为 RRRF ,最终位置为 (1, -1);

改为 RRRL ,最终位置为 (2, 0)。

不同的最终位置共有 6 种。
 

dx = [0, -1, 0, 1]
dy = [1, 0, -1, 0]
s = ""
x, y = 0, 0
xx, yy = 0, 0
flag = 100000

n = int(input())  
s = input()  

# 移动函数
def mv(x, y):
    cns = flag % 4
    if cns == 0:
        x += dx[cns]
        y += dy[cns]
    if cns == 1:
        x += dx[cns]
        y += dy[cns]
    if cns == 2:
        x += dx[cns]
        y += dy[cns]
    if cns == 3:
        x += dx[cns]
        y += dy[cns]
    return x, y

# 执行路径操作
def mvs(x, y):
    global flag
    for i in range(len(s)):
        if s[i] == 'F':
            x, y = mv(x, y)
        if s[i] == 'L':
            flag += 1
            x, y = mv(x, y)
        if s[i] == 'R':
            flag -= 1
            x, y = mv(x, y)
    return x, y

x, y = mvs(x, y)
ans = 0
for i in range(len(s)):
    xx, yy = 0, 0
    if s[i] == 'F':
        s = s[:i] + 'R' + s[i+1:]
        xx, yy = mvs(xx, yy)
        if xx != x or yy != y:
            ans += 1
        xx, yy = 0, 0
        flag += 1
        s = s[:i] + 'L' + s[i+1:]
        xx, yy = mvs(xx, yy)
        if xx != x or yy != y:
            ans += 1
        xx, yy = 0, 0
        flag -= 1
        s = s[:i] + 'F' + s[i+1:]
        continue
    if s[i] == 'R':
        s = s[:i] + 'L' + s[i+1:]
        xx, yy = mvs(xx, yy)
        if xx != x or yy != y:
            ans += 1
        xx, yy = 0, 0
        flag -= 1
        s = s[:i] + 'F' + s[i+1:]
        xx, yy = mvs(xx, yy)
        if xx != x or yy != y:
            ans += 1
        xx, yy = 0, 0
        s = s[:i] + 'R' + s[i+1:]
        continue
    if s[i] == 'L':
        s = s[:i] + 'F' + s[i+1:]
        xx, yy = mvs(xx, yy)
        if xx != x or yy != y:
            ans += 1
        xx, yy = 0, 0
        s = s[:i] + 'R' + s[i+1:]
        xx, yy = mvs(xx, yy)
        if xx != x or yy != y:
            ans += 1
        xx, yy = 0, 0
        flag += 1
        s = s[:i] + 'L' + s[i+1:]

print(ans)

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值