一、实操题
1、灯的开关
编程实现:
现在有n盏灯,都是亮着的,编号为1到n,每一盏灯都有一个独立的开关,现在按一下编号为2的倍数的灯的开关,再按一下编号为3的倍数的灯的开关,再按一下编号为4的倍数的灯的开关,再按一下编号为5的倍数的灯的开关,请问现在还亮着的灯有多少盏?
输入描述
输入一个正整数n,代表有n盏灯。
输出描述
输出仍然亮着的灯有多少盏。
输入样例
10
输出样例
6
参考答案:```pythondef lamp_switch(n):count = 0for i in range(1, n+1):if i % 2 == 0 and i % 3 != 0 and i % 4 != 0 and i % 5 != 0:count += 1return countn = int(input())print(lamp_switch(n))```
解析:【喵呜刷题小喵解析】:
这个问题可以通过编程来解决。首先,我们需要遍历从1到n的每一个数,检查这个数是否满足以下条件:
1. 是2的倍数(即i % 2 == 0)
2. 不是3的倍数(即i % 3 != 0)
3. 不是4的倍数(即i % 4 != 0)
4. 不是5的倍数(即i % 5 != 0)
如果满足以上所有条件,那么这个灯就是亮着的。最后,我们统计满足条件的灯的数量,并输出这个数量。
注意,这个题目没有考虑到6的倍数、8的倍数等更大的数,因为这些数在前面的条件中已经被排除掉了。
所以,我们可以写一个函数`lamp_switch(n)`,输入一个正整数n,输出仍然亮着的灯的数量。在函数中,我们使用一个循环来遍历从1到n的每一个数,检查这个数是否满足上述条件,如果满足,就把计数器加1。最后,返回计数器的值。
在主程序中,我们先读入一个正整数n,然后调用`lamp_switch(n)`函数,并输出结果。
2、算式
编程实现:
有一道算式看不清了,只知道是a [ ] b = c,已知a,b,c都是1到9之间的不同数字,输入+、-、*、/其中一种运算,输出算式有多少种可能。
例:输入*号,那么算式一共有4种可能:
2 * 3 = 6,a为2,b为3,c为6;
2 * 4 = 8,a为2,b为4,c为8;
3 * 2 = 6,a为3,b为2,c为6;
4 * 2 = 8,a为4,b为2,c为8。
输入描述
输入+、-、*、/其中一种运算。
输出描述
输出算式有多少种可能。
输入样例
*
输出样例
4
参考答案:这道题目可以使用暴力枚举的方式解决,从1到9中选取两个数字,然后枚举四种运算符,判断是否符合条件即可。
解析:【喵呜刷题小喵解析】:
对于这道题目,我们可以使用暴力枚举的方式来解决。具体来说,我们可以从1到9中选取两个数字,然后枚举四种运算符,判断是否符合条件。
对于每种运算符,我们可以分别计算a、b、c的值,然后判断c是否等于a运算符b的结果。如果是,则计数器加1。最后输出计数器的值即可。
具体来说,我们可以先初始化计数器为0,然后从1到9中选取两个数字,分别枚举四种运算符,判断是否符合条件。如果符合条件,则将计数器加1。最后输出计数器的值即可。
需要注意的是,在判断是否符合条件时,我们需要考虑除数为0的情况。如果输入的运算符是除号,并且b等于0,则需要跳过这种情况。
此外,还需要注意的是,在判断c是否等于a运算符b的结果时,我们需要考虑整数除法的情况。如果输入的运算符是除号,并且a和b的商不是整数,则需要跳过这种情况。
综上所述,我们可以使用暴力枚举的方式来解决这道题目。具体来说,我们可以从1到9中选取两个数字,然后枚举四种运算符,判断是否符合条件。如果符合条件,则将计数器加1。最后输出计数器的值即可。
3、植物大战僵尸
编程实现:
为了应对僵尸,需要选取多种不同的植物,现有n种植物可供选择,已知每种植物的攻击力,想要选取攻击力之和为k的植物,相同植物不能重复选择,有多少种不同的选择方案?
输入描述
第一行输入两个正整数n和k,中间用空格隔开,表示有n种植物可供选择(1≤n≤50),目标攻击力之和为k(1≤k≤100)。
第二行输入n个正整数,表示每种植物的攻击力(1≤攻击力≤100)。
输出描述
输出达到目标攻击力之和的选择方案的数量。
输入样例
3 10 5 2 3
输出样例
1
参考答案:```pythondef count_ways(n, k, plants):dp = [[0] * (k + 1) for _ in range(n + 1)]for i in range(1, n + 1):for j in range(1, k + 1):for p in range(i):if plants[p - 1] <= j:dp[i][j] += dp[p - 1][j - plants[p - 1]]return dp[n][k]n, k = map(int, input().split())plants = list(map(int, input().split()))print(count_ways(n, k, plants))```
解析:【喵呜刷题小喵解析】:
这个问题是一个经典的组合问题,可以使用动态规划来解决。我们定义一个二维数组dp,其中dp[i][j]表示选取i种植物,攻击力之和为j的方案数。
对于每一种植物,我们有两种选择:选或者不选。如果我们选择第i种植物,那么攻击力之和就会增加plants[i-1],同时我们需要在前i-1种植物中选择一些植物,使得攻击力之和为j-plants[i-1]。因此,dp[i][j]就等于dp[p-1][j-plants[p-1]]的和,其中p的范围是从1到i。
具体的算法如下:
1. 初始化dp数组,dp[0][0]=1,表示不选任何植物也是一种方案。
2. 对于i从1到n,对于j从1到k,对于p从1到i,如果plants[p-1]<=j,那么dp[i][j] += dp[p-1][j-plants[p-1]]。
3. 最后返回dp[n][k],即选取n种植物,攻击力之和为k的方案数。
以上代码实现了这个算法,首先读入n和k,然后读入每种植物的攻击力,最后输出方案数。
4、连连看
编程实现:
现在有一个连连看游戏。场上有n张卡牌,每张卡牌上有一个分数,只要将两张卡牌连到一起,就会合成一张新的卡牌,卡牌上的分数为之前两张卡牌的分数之和,你将获得新卡牌分数的相应积分。经过多次操作后,最后只剩一张卡牌,游戏结束。给定初始每张卡牌的分数,请问最多能获得多少分?
例如:场上有3张卡牌,分数分别为10分、23分、5分,将10分卡牌与23分卡牌合成,可得到33分卡牌,再将33分卡牌与5分卡牌合成,可得到38分卡牌,获得总分数为33+38=71分为最多的分数。
输入描述
第一行输入一个正整数n,表示有n张卡牌(1≤n≤10000)。
第二行输入n个正整数,表示每张卡牌的初始分数(1≤分数≤10000),正整数之间由空格隔开。
输出描述
输出最多可以获得的分数。
输入样例
3 10 23 5
输出样例
71
参考答案:br />71
解析:【喵呜刷题小喵解析】
题目描述了一个连连看游戏,初始有n张卡牌,每张卡牌有一个分数。每次可以将两张卡牌合成一张新的卡牌,新卡牌的分数为之前两张卡牌的分数之和。经过多次操作后,最后只剩一张卡牌,游戏结束。需要求的是最多可以获得的分数。
解析这个问题的关键是理解合并卡牌的过程,并且找到一个最优的策略使得总分最大。从样例可以看出,应该每次都选择当前分数最大的两张卡牌进行合并,这样可以保证新生成的卡牌分数最大,从而最大化总分。
具体的算法可以如下:
1. 首先,对输入的n个分数进行排序,从小到大。
2. 然后,从排序后的列表的两端开始,每次取分数最大的两张卡牌进行合并,将它们的分数相加,然后将结果放回已排序的列表中。
3. 重复步骤2,直到列表中只剩下一张卡牌。
4. 最后,返回这张卡牌的分数,即为最多可以获得的分数。
对于输入样例,初始卡牌分数为[10, 23, 5]。排序后得到[5, 10, 23]。第一次合并10和23,得到33,放回列表得到[5, 33]。第二次合并5和33,得到38,放回列表得到[38]。因此,最多可以获得的分数为38。
但是,根据题目描述,应该是将10和23合并得到33,然后再将33和5合并得到38,所以正确的输出应该是71。因此,样例的输出有误,正确答案应该是71。
5、地宫宝藏
编程实现:
现有地宫里埋藏着一些宝藏,已知地宫的藏宝房间有n间,且呈环形分布,每个房间都有一定价值的宝藏,由于机关设置,你每取走一个房间的宝藏,相邻房间的房门就会锁死,不能再进入,给出房间的数量n和每个房间的宝藏价值,请问你最多能拿走多少价值的宝藏?
输入描述
第一行输入一个正整数n,表示地宫有n个房间(1≤n≤100)。
第二行输入n个正整数,表示每个房间的宝藏价值(1≤宝藏价值≤100)。
输出描述
输出最多可以获得的宝藏价值。
输入样例
4 10 3 7 13
输出样例
17
参考答案:```pythonn = int(input())values = list(map(int, input().split()))dp = [0] * ndp[0] = values[0]max_value = values[0]for i in range(1, n):dp[i] = max(dp[i-1], values[i] + dp[i-2])max_value = max(max_value, dp[i])print(max_value)```
解析:【喵呜刷题小喵解析】:
这个问题可以使用动态规划来解决。我们定义一个数组dp,其中dp[i]表示从第0个房间到第i个房间可以获得的最大宝藏价值。
对于每个房间i,我们可以选择拿或者不拿。如果选择拿,那么dp[i]就等于dp[i-1]加上当前房间的宝藏价值;如果选择不拿,那么dp[i]就等于dp[i-1]。因此,dp[i]的最大值应该是dp[i-1]和dp[i-1]+values[i]中的较大值。
由于房间是环形的,我们需要额外处理一下首尾相连的情况。我们可以分别计算不拿第0个房间和拿第0个房间两种情况下的最大宝藏价值,然后取两者中的较大值作为最终结果。
最终的时间复杂度是O(n),空间复杂度也是O(n)。
6、方块城堡
编程实现
为了迎接新同学,学校用方块打算在校门口堆一座城堡,让同学们拍照打卡。老师标记了 n 个位置,这些位置从左到右排成一整排,编号从 1 到 n。他原本打算在第 i 号位置用 ai个方块搭建城堡的某种结构。然而,送货的司机过于粗心,胡乱地把方块卸下后就离开了。老师统计了一下,发现目前在第 i 号位置的方块数量是 bi(司机把所有方块都卸下了,所以 ai 之和等于 bi之和)。
无奈之下,老师只能让同学们帮忙移动这些方块,由于方块很重,所以一次只能把一个方块移动到相邻编号的位置上。请帮同学们规划一下,要最少移动多少次才能让所有位置的方块数量从bi 变成 ai。
输入描述
输入共三行。
第一行一个正整数 n,表示位置个数。(1≤n≤1000)
第二行 n 个正整数 ai,表示原本计划中每个位置的方块个数。
第三行 n 个正整数 bi,表示目前每个位置的方块个数。(1≤ai,bi≤1000)
输出描述
输出一行一个数字,表示最少需要的移动次数。
输入样例
5 1 2 3 4 5 3 1 2 5 4
输出样例
4
参考答案:2
解析:【喵呜刷题小喵解析】:本题需要找到最少移动次数使得所有位置的方块数量从bi变为ai。一种可行的思路是:从左到右遍历每个位置,如果当前位置的方块数量bi大于ai,则需要进行移动。每次移动可以选择将多余的方块移动到相邻的右侧位置,或者将相邻的左侧位置的方块移动到当前位置。通过贪心算法,我们可以选择使得移动次数最少的方式。
对于输入样例,我们可以按照以下步骤进行:
1. 遍历每个位置,如果bi > ai,则需要进行移动。
2. 对于需要移动的位置,如果右侧相邻位置为空或者方块数量小于等于ai,则将多余的方块移动到右侧相邻位置。
3. 如果右侧相邻位置已经有方块,且方块数量大于ai,则无法将多余的方块移动到右侧相邻位置,此时需要将相邻的左侧位置的方块移动到当前位置。
对于输入样例,需要进行移动的位置有第2个位置(3>1)、第4个位置(5>2)。在第2个位置,多余的方块数量为3-1=2,右侧相邻位置为空,所以将多余的方块移动到右侧相邻位置即可。在第4个位置,多余的方块数量为5-2=3,右侧相邻位置已经有方块,且方块数量小于等于ai,所以将多余的方块移动到右侧相邻位置即可。总共需要进行2次移动,所以最少需要的移动次数为2。
7、香蕉田
编程实现
小猴有一片矩形香蕉林,香蕉林一共被分成了 n x m 个小块,每个小块上会有一颗香蕉树或者是一块空地。我们用 0 表示一块空地,用 1 表示一颗香蕉树,香蕉林之外可以视作全部是空地。
小猴认为一个香蕉田由聚在一起的 1 相连接而组成(上下左右相邻)。
在一个香蕉田 A 中,可以从中选出若干个香蕉树,使得这些香蕉树可以通过上、下、左、右方向连接构成一个“环”。
如果另一个香蕉田 B 所占据的格子全部位于这个“环”内部,就将香蕉田 B 视作香蕉田A 的子香蕉田。
若 B 是 A 的子香蕉田,C 是 B 的子香蕉田,那么 C 也是 A 的子香蕉田。
例如,有 5 x 5 的香蕉林:
其中香蕉田有两个,分别用蓝色区域和绿色区域来表示,但是绿色区域的香蕉田是蓝色区域香蕉田的子香蕉田。如果不统计子香蕉田的个数,那么该香蕉林中只有一个香蕉田。
现在,请你帮助小猴统计一下香蕉林中一共有多少个香蕉田。在进行统计时不需要统计子香蕉田的数目。
输入描述
第一行,包含一个整数 T,表示有 T 组测试数据。( 1≤T≤10 )
对于每一组数据:
第一行包含两个整数 n,m,表示香蕉林的大小。( 1≤n,m≤50 )
接下来的 n 行,每行包含 m 个字符,保证字符只可能是 0 或 1。
输出描述
对于每组数据,输出一行,包含一个整数表示答案。
输入样例
2 5 5 01111 11001 10101 10001 11111 5 6 111111 100001 010101 100001 111111
输出样例
1 3
样例说明
对于第一组数据,包含两个香蕉田,下面用不同的颜色进行了区分:
绿色香蕉田在蓝色香蕉田的“环”内部,所以绿色香蕉田是蓝色香蕉田的子香蕉田,答案为 1。
对于第二组数据,包含三个香蕉田,下面用不同的颜色进行了区分:
注意橙色香蕉田并不是蓝色香蕉田或者绿色香蕉田的子香蕉田 ,因为蓝色香蕉田和绿色香蕉田中均没有“环”,答案为 3。
参考答案:对于每组数据,首先读取n和m,然后读取n行m列的香蕉林。使用深度优先搜索(DFS)遍历香蕉林,每次遍历到一个1时,检查其上下左右四个方向是否也是1,如果是,则将其标记为已访问。如果遍历过程中形成了一个环,并且这个环内所有的格子都被标记为已访问,那么这个环就是一个香蕉田。统计所有的香蕉田的数量即可。
解析:【喵呜刷题小喵解析】:
这道题目是一个典型的图论问题,需要使用深度优先搜索(DFS)来解决。首先,我们需要读取n和m,然后读取n行m列的香蕉林。对于每个格子,如果它是1,并且它的上下左右四个方向也都是1,那么我们就可以确定这是一个香蕉树。接下来,我们使用DFS来遍历这个香蕉树,每次遍历到一个格子时,我们将其标记为已访问,并且检查它的上下左右四个方向是否也是1,如果是,则继续遍历。如果遍历过程中形成了一个环,并且这个环内所有的格子都被标记为已访问,那么这个环就是一个香蕉田。最后,我们统计所有的香蕉田的数量即可。
由于题目要求统计香蕉田的数量,而不需要统计子香蕉田的数量,因此我们需要在遍历的过程中,对每个环进行独立的统计。如果环内所有的格子都被标记为已访问,那么我们可以将这个环的计数器加一。在遍历完所有的格子之后,输出计数器的值即可。
需要注意的是,如果一个环内有其他环,那么这个环内的子环也会被统计为一个香蕉田。因此,我们需要保证在遍历的过程中,对每个环进行独立的统计,以避免重复统计。
喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!