一、编程题
1、问题求解
给定一个正整数N,求最小的M满足比N大且M与N的二进制表示中有相同数目的1。
举个例子,假如给定N为78,二进制表示为1001110,包含4个1,那么最小的比N大的并且二进制表示中只包含4个1的数是83,其二进制是1010011,因此83就是答案。
时间限制:1000
内存限制:65536
输入
输入若干行,每行一个数N(1 ≤ N ≤ 1000000),如果这行为0表示输入结束。
输出
对于每个N,输出对应的M。
样例输入
1
2
3
4
78
0
样例输出
2
4
5
8
83
参考答案:
无
解析:【喵呜刷题小喵解析】对于这个问题,我们可以使用Python编程语言来解决。首先,我们需要将输入的N转换为二进制字符串,并统计其中1的个数。然后,根据1的个数构造一个新的二进制字符串,其1的个数与输入数字相同,且比输入数字大。接着,我们将新的二进制字符串转换为十进制数,并检查该数是否满足条件。如果不满足,我们递增该数,直到找到一个满足条件的数为止。最后,我们输出找到的M。算法步骤如下:1. 将数字N转换为二进制字符串;2. 统计二进制字符串中1的个数;3. 根据1的个数构造一个新的二进制字符串;4. 将新的二进制字符串转换为十进制数M;5. 如果M小于等于N,则将M加1;6. 如果新的M满足条件,即其二进制表示中1的个数与N相同,则返回M,否则返回步骤5。在Python中,我们可以使用bin()函数将数字转换为二进制字符串,使用count()函数统计字符串中1的个数,使用int()函数将字符串转换为十进制数。在构造新的二进制字符串时,我们可以使用字符串拼接来实现。在检查M是否满足条件时,我们可以使用字符串的rstrip()函数去除字符串右侧的0,并比较1的个数与新的二进制字符串的长度减去去除0后的长度是否相等。
2、算24
给出4个小于10个正整数,你可以使用加减乘除4种运算以及括号把这4个数连接起来得到一个表达式。现在的问题是,是否存在一种方式使得得到的表达式的结果等于24。 这里加减乘除以及括号的运算结果和运算的优先级跟我们平常的定义一致(这里的除法定义是实数除法)。 比如,对于5,5,5,1,我们知道5 * (5 – 1 / 5) = 24,因此可以得到24。又比如,对于1,1,4,2,我们怎么都不能得到24。
时间限制:6000
内存限制:65536
输入
输入数据包括多行,每行给出一组测试数据,包括4个小于10个正整数。最后一组测试数据中包括4个0,表示输入的结束,这组数据不用处理。
输出
对于每一组测试数据,输出一行,如果可以得到24,输出"YES";否则,输出"NO"。
样例输入
5 5 5 1
1 1 4 2
0 0 0 0
样例输出
YES
NO
参考答案:
无
解析:【喵呜刷题小喵解析】:本题是一道经典的算24点问题,可以使用回溯算法来解决。由于输入数据包括多组测试数据,所以我们需要设计一个通用的算法来处理所有可能的输入。回溯算法是一种通过穷举所有可能的解来寻找问题答案的算法。在这个问题中,我们需要穷举所有可能的运算顺序和括号组合,然后计算表达式的值。如果表达式的值等于24,就输出"YES",否则输出"NO"。由于数字只有4个,所以直接穷举所有可能的运算顺序和括号组合是不现实的。因此,我们可以采用一种更高效的算法,即回溯算法。在回溯的过程中,我们可以记录已经使用过的数字和运算符,避免重复计算。具体的算法实现可以参考上述喵呜AI答案中的描述。由于本题是一道编程题,所以具体的代码实现需要根据具体的编程语言来实现。
3、忍者道具
忍者道具有很多种,苦无,飞镖,震爆弹。L君热衷于收集忍者道具,现在他有N个道具,每个道具的重量分别是C1、C2…CN。现在他想把这N个道具装到载重量为W的工具包里,请问他最少需要多少个工具包?
时间限制:1000
内存限制:65536
输入
第一行包含两个用空格隔开的整数,N和W。 接下来N行每行一个整数,其中第i+1行的整数表示第i个道具的重量Ci。
输出
输出一个整数,最少需要多少个工具包。
样例输入
5 1996
1
2
1994
12
29
样例输出
2
提示
对于100%的数据,1<=N<=18,1<=Ci<=W<=10^8。
参考答案:
无
解析:【喵呜刷题小喵解析】本题是一道经典的背包问题变种,要求将N个道具放入载重量为W的工具包中,并求出最少需要多少个工具包。首先,我们需要读取输入,包括道具的数量N和工具包的载重量W,以及每个道具的重量C1, C2, ..., CN。我们可以使用一个循环来尝试将道具放入工具包中,直到道具的总重量超过工具包的载重量W为止。每次循环中,我们计算当前需要多少个工具包,如果当前道具的总重量已经超过了工具包的载重量,我们就增加一个工具包,并从总重量中减去工具包的载重量。最终,当道具的总重量不再超过工具包的载重量时,我们输出需要的工具包数量。在Python中,我们可以使用map函数来读取输入,使用while循环来尝试将道具放入工具包中,并使用print函数来输出需要的工具包数量。需要注意的是,本题的时间限制和内存限制较小,因此我们需要尽可能优化算法,避免使用过多的时间和空间。在本题中,我们可以使用循环来尝试将道具放入工具包中,而不是使用动态规划等更复杂的算法。
4、泳池
小C在一个排水系统不太好的学校上学。又是一个下雨天,学校里高低不平积了很多水。小C突发奇想:如果大雨一直下,多久以后我可以在学校里游泳呢?
学校是 N x N 的坐标方格 grid 中,每一个方格的值 grid(i,j)表示在位置 (i,j) 的高度。现在开始下雨了。当时间为 t 时,此时雨水导致方格中任意位置的水位为 t 。你可以从一个方格游向四周相邻的任意一个方格,但是前提是此时水位必须同时淹没这两个方格。假定小C的游动是不耗时的。
现在小C从坐标方格的左上(0,0)出发。最少耗时多久他才能到达坐标方格的右下平台 (N-1, N-1)?
时间限制:1000
内存限制:65536
输入
第一行有一个整数N,以下是一个N*N的方阵,代表各处的高度。 输入范围: 2 ≤ N ≤ 300 0 ≤ Height ≤ 10000000
输出
输出一个整数,代表最少等待时间T
样例输入
样例输入1:
2
0 2
1 3
样例输入2:
5
0 1 2 3 4
24 23 22 21 5
12 13 14 15 16
11 17 18 19 20
10 9 8 7 6
样例输出
样例输出1:
3
样例输出2:
16
提示
样例1:时间为3时,才可以游向平台(1,1),此时水位为3。 样例2:时间为16时,水位为16,此时才能保证(0,0)和(4,4)是联通的(请自行找出一条通路)。
【请在自己电脑上的编程软件上做 C语言没有标准答案 运行测试无误即为正确】
参考答案:
无
解析:【喵呜刷题小喵解析】:首先,我们需要读取输入数据,包括N和N*N的方格高度矩阵。然后,我们使用一个visited数组来记录每个方格是否已经被访问过。初始时,只有起点(0,0)被访问过。接着,我们遍历每个方格,对于每个方格,我们计算当前时间currTime,即方格的高度。然后,我们尝试从当前方格向四个相邻方格移动,如果相邻方格在网格范围内,且高度小于等于当前时间,且未被访问过,则将其标记为已访问,并更新minTime为currTime,如果当前方格是终点(N-1,N-1),则结束循环。最后,我们输出minTime,即最少等待时间。需要注意的是,由于题目要求小C的游动是不耗时的,因此我们可以直接通过比较方格高度来判断是否可以从一个方格游向另一个方格。同时,由于题目要求输出最少等待时间,因此我们需要记录已经访问过的方格,避免重复计算。
喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!