目录
1822: 六位数
2154: 饮料换购
1959: 01翻转
1965: Numbers
2155: 移动距离
2133: 魔板
2090: 神秘数列
题目描述
请编写一个程序统计在M和N之间(M
(2) AB+CD=EF。即将这个六位数拆成三个两位数,使得第1个和第2个两位数的和等于第3个两位数。
输入
单组输入。 输出 输出在M到N之间(包含M和N)满足要求的六位数的个数。 思路:简单题,按题目意思,分别判断两个条件即可。 题目描述 乐羊羊饮料厂正在举办一次促销优惠活动。 输入 输入存在多组测试数据 输出 对于每组数据输出一行,包含一个整数,表示实际得到的饮料数 思路:通过题意,很容易发现这是一个重复的喝饮料、换饮料问题,也就是说我们可以使用递归或者递推来解决这个问题。 题目描述 小H有个仅有01构成的n行n列矩阵。 输入 第1行一个整数n(1<=n<=100),表示矩阵大小。 输出 对于每天,输出翻转操作后矩阵的状态。 思路:简单的模拟题,注意输入的顺序即可。 题目描述 小b打算拉着小h做一道简单的数学题,但是小h觉得太简单了,于是找到了你,相信对你来说也是小菜一碟。 具体题目为:现在有一个10进制整数122,如果转成16进制的话应该是7A,那么位数和则为17。现在题目升级为给定一个10进制整数n,需要对n转化为2~n-1进制下对应的数,并求出它们的位数和a。然后将a作为分子,n转化为不同格式数的个数作为分母b。输出最简分子式a/b 输入 第一行输入一个整数t,表示t组数据(t<=100) 接下来t行,每行输入一个10进制整数n(2 输出 输出n行,每行输出题目描述的最简分子式 思路:题目不难,就是一道进制转换加最小公约数的题目。 题目描述 X星球居民小区的楼房全是一样的,并且按矩阵样式排列。 我们的问题是:已知了两个楼号m和n,需要求出它们之间的最短移动距离 输入 输入存在多组测试数据 输出 要求输出一个整数,表示m n 两楼间最短移动距离。 思路:题目看起来有点绕,其实就是将两个楼号转换成坐标(x, y),答案就是x之间的差值的绝对值加上y之间差值的绝对值。 题目描述 Rubik先生在发明了风靡全球魔方之后,又发明了它的二维版本——魔板。这是一张有8个大小相同的格子的魔板: 我们知道魔板的每一个方格都有一种颜色。这8种颜色用前8个正整数来表示。可以用颜色的序列来表示一种魔板状态,规定从魔板的左上角开始,沿顺时针方向依次取出整数,构成一个颜色序列。对于上图的魔板状态,我们用序列1,2,3,4,5,6,7,8来表示。这是基本状态。 A:交换上下两行; B:将最右边的一列插入最左边; C:魔板中央作顺时针旋转。下面是对基本状态进行操作的示范: B: C: 对于每种可能的状态,这三种基本操作都可以使用。 你要编程计算用最少的基本操作完成基本状态到特殊状态的转换,输出基本操作序列。 输入 输出 思路:通过对题目的阅读,我们不难发现,题目本质上是一个进行重复操作,然后寻找目标的问题,加上题目具有最短这一要求,所以可以确定这是一道广度优先搜索的题目。同时,我们是同字典来记录操作序列。 题目描述 喜欢探险的Kimi同学在一个山洞中发现了一串神秘的数,这串数的前七项如下: 输入 单组输入。 输出 输出神秘数列的第N项的值。 思路:这是一道规律题,一般像这种数列题都是斐波那契数列题的变种,也就是寻找当前数与之前若干个数的之间的关系,想到了就是一个公式题,没想到就是难搞了。
输入两个六位正整数M和N(Mdef computed(x: int):boxs = []while x > 0:tmp, x = x % 10, x // 10if tmp in boxs: # 说明不满足条件1return 0else:boxs.append(tmp)if boxs[0] + boxs[1] * 10 != boxs[2] + boxs[3] * 10 + boxs[4] + boxs[5] * 10: # 说明不满足条件2return 0return 1m, n = map(int, input().split())
cnt = 0
for i in range(m, n + 1):cnt += computed(i)
print(cnt)
2154: 饮料换购
乐羊羊C型饮料,凭3个瓶盖可以再换一瓶C型饮料,并且可以一直循环下去(但不允许暂借或赊账)。
请你计算一下,如果小明不浪费瓶盖,尽量地参加活动。
那么,对于他初始买入的n瓶饮料,最后他一共能喝到多少瓶饮料。
每组测试数据输入一行包含一个正整数n(1<=n<=10000)while True:try:n = int(input())cnt, cap = n, n # cnt代表喝了多少,cap代表手上的瓶盖数量,这里表示先把n瓶喝完了while cap > 2:tmp, cap = cap // 3, cap % 3 # 换饮料cnt, cap = cnt + tmp, cap + tmp # 喝饮料print(cnt)except:break
1959: 01翻转
每天小H都会选择一个子矩阵,进行01翻转操作,
即该区域状态:0->1,1->0。
接下来n行,表示矩阵初始状态。
第n+2行,一个整数q(1<=q<=100),表示天数。
接下来q行,每行4个整数x1,y1,x2,y2,分别表示子矩阵的左上角坐标,右下角坐标。
题目保证:1<=x1<=x2<=n,1<=y1<=y2<=n。
(矩阵每行最后一个元素均无空格)def draw():x1, y1, x2, y2 = map(int, input().split())for i in range(x1 - 1, x2):for j in range(y1 - 1, y2):maze[i][j] = (maze[i][j] + 1) % 2for i in range(n):for j in range(n):print('', maze[i][j], end='') if j != 0 else print(maze[i][j], end='')print()while True:try:n = int(input())maze = [list(map(int, input().split())) for _ in range(n)]q = int(input())while q > 0:q, _ = q - 1, draw()except:break
1965: Numbers
def computed(x: int): # 计数位数和res = 0for y in range(2, x):tmp = xwhile tmp > 0:res, tmp = res + tmp % y, tmp // yreturn resdef fm(x: int, y: int):for i in range(min(x, y), 0, -1):if x % i == 0 and y % i == 0:return x // i, y // it = int(input())
while t > 0:t, n = t - 1, int(input())a, b = fm(computed(n), n - 2)print(f"{a}/{b}")
2155: 移动距离
其楼房的编号为1,2,3... 当排满一行时,从下一行相邻的楼往反方向排号。
比如:当小区排号宽度为6时,开始情形如下:1 2 3 4 5 6
12 11 10 9 8 7
13 14 15 .....
(不能斜线方向移动)
输入为3个整数w m n,空格分开,都在1到10000范围内
w为排号宽度,m,n为待计算的楼号。def arrange(x: int):a, b = x // w, x % wif b == 0: # 正好整除,a回退一层,b回退wa, b = a - 1, wif a % 2 == 1: # 如果是偶数层,就把b倒过来数,也就是w-b+1b = w - b + 1return a, bwhile True:try:w, m, n = map(int, input().split())x1, y1 = arrange(m)x2, y2 = arrange(n)print(abs(x1 - x2) + abs(y1 - y2))except:break
2133: 魔板
1234
8765
8765
1234
4123
5876
1724
8635
输入仅一行,包括8个整数,用空格分开,表示目标状态。
输出文件的第一行包括一个整数,表示最短操作序列的长度。第二行为在字典序中最早出现的操作序列。
def a(old: str): # A操作new = list(old)new.reverse()new = "".join(new)if boxs.get(new, -1) == -1:boxs[new] = boxs[old] + 'A'q.append(new)def b(old: str): # B操作new = old[3] + old[:3] + old[5:] + old[4]if boxs.get(new, -1) == -1:boxs[new] = boxs[old] + 'B'q.append(new)def c(old: str): # C操作new = old[0] + old[6] + old[1] + old[3] + old[4] + old[2] + old[5] + old[7]if boxs.get(new, -1) == -1:boxs[new] = boxs[old] + 'C'q.append(new)def bfs(x: str):while q:tmp = q.pop(0)a(tmp), b(tmp), c(tmp)res = boxs.get(x, -1)if res != -1: # 说明找到了目标print(f"{len(res)}\n{res}")returnorder, boxs = "".join(input().split()), {"12345678": ""}
q = ["12345678"] # 列表q用来记录源操作序列,字典boxs用来记录操作序列
bfs(order)
2090: 神秘数列
1, 1, 8, 22, 85, 281, 988, ......
Kimi很想知道这个神秘数列中所蕴含的规律,你能否编写一个程序帮帮他。
当输入一个正整数N时,输出这个神秘数列第N项的值。
输入一个正整数N,N<=50。n, nums = int(input()), [0, 1, 1]
for _ in range(3, n + 1):nums.append(5 * nums[-2] + 2 * nums[-1] + 1)
print(nums[n])
下一篇:GIT常用操作