卡拉兹(Callatz)猜想已经在1001中给出了描述。在这个题目里,情况稍微有些复杂。
当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数。例如对 n=3 进行验证的时候,我们需要计算 3、5、8、4、2、1,则当我们对 n=5、8、4、2 进行验证的时候,就可以直接判定卡拉兹猜想的真伪,而不需要重复计算,因为这 4 个数已经在验证3的时候遇到过了,我们称 5、8、4、2 是被 3“覆盖”的数。我们称一个数列中的某个数 n 为“关键数”,如果 n 不能被数列中的其他数字所覆盖。
现在给定一系列待验证的数字,我们只需要验证其中的几个关键数,就可以不必再重复验证余下的数字。你的任务就是找出这些关键数字,并按从大到小的顺序输出它们。
每个测试输入包含 1 个测试用例,第 1 行给出一个正整数 K (<100),第 2 行给出 K 个互不相同的待验证的正整数 n (1<n≤100)的值,数字间用空格隔开。
每个测试用例的输出占一行,按从大到小的顺序输出关键数字。数字间用 1 个空格隔开,但一行中最后一个数字后没有空格。
6 3 5 6 7 8 11
结尾无空行
7 6
结尾无空行
思路:
创建一个字典,每当数字出现,就让字典对应值+1,最后统计出字典对应值为1的数
代码:
n = input() L = list(map(int,input().split())) D = dict.fromkeys(L,0) for i in L: while i != 1: if i in D.keys(): D[i] = D[i] + 1 if i%2 == 0: i = i//2 else: i = (3*i+1)//2 out = [] for item in D.items(): # D.item()以列表形式输出(val,key) if item[0] in L and item[1] == 1: out.append(item[0]) out.sort(reverse = True) for i in range(len(out)): if i == len(out) - 1: print(out[i],end ='') else: print(out[i],end = ' ' )
运行结果:
测试点 | 结果 | 分数 | 耗时 | 内存 |
---|---|---|---|---|
0 | 答案正确 | 15 | 14 ms | 3128 KB |
1 | 答案正确 | 2 | 16 ms | 3292 KB |
2 | 答案正确 | 2 | 14 ms | 3136 KB |
3 | 答案正确 | 3 | 15 ms | 3164 KB |
4 | 答案正确 | 3 | 15 ms | 3204 KB |
让我们用字母 B
来表示“百”、字母 S
表示“十”,用 12...n
来表示不为零的个位数字 n
(<10),换个格式来输出任一个不超过 3 位的正整数。例如 234
应该被输出为 BBSSS1234
,因为它有 2 个“百”、3 个“十”、以及个位的 4。
每个测试输入包含 1 个测试用例,给出正整数 n(<1000)。
每个测试用例的输出占一行,用规定的格式输出 n。
234
结尾无空行
BBSSS1234
结尾无空行
23
结尾无空行
SS123
结尾无空行
思路:
计算出输入值10,100,……的数量,再以字符串的形式相加获得输出。
代码:
n = int(input()) s = str('') if n//100 != 0: s = s + 'B'*(n//100) n = n%100 else: pass if n//10 != 0: s = s + 'S'*(n//10) n = n%10 else: pass if n//10 == 0: for i in range(1,n+1): s = s + str(i) print(s)
运行结果:
测试点 | 结果 | 分数 | 耗时 | 内存 |
---|---|---|---|---|
0 | 答案正确 | 4 | 16 ms | 3200 KB |
1 | 答案正确 | 4 | 19 ms | 3244 KB |
2 | 答案正确 | 1 | 17 ms | 3252 KB |
3 | 答案正确 | 1 | 15 ms | 3264 KB |
4 | 答案正确 | 1 | 17 ms | 3284 KB |
5 | 答案正确 | 1 | 16 ms | 3200 KB |
6 | 答案正确 | 1 | 15 ms | 3300 KB |
7 | 答案正确 | 1 | 16 ms | 3276 KB |
8 | 答案正确 | 1 | 16 ms | 3156 KB |
暂未写出
一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0A1⋯AN−1)变换为(AN−M⋯AN−1A0A1⋯AN−M−1)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。
在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
6 2 1 2 3 4 5 6
结尾无空行
5 6 1 2 3 4
结尾无空行
思路:
将输入转化为列表,删除列表最后M个元素后添加到列表开头
代码:
n,s = input().split() n,s = int(n),int(s) number_list = list(map(int,input().split())) for i in range(s): num = number_list.pop() number_list.insert(0,num) for i in range(n): if i == len(number_list) - 1: print(number_list[i],end = '') else: print(number_list[i],end = ' ')
运行结果:
测试点 | 结果 | 分数 | 耗时 | 内存 |
---|---|---|---|---|
0 | 答案正确 | 10 | 15 ms | 3264 KB |
1 | 答案正确 | 3 | 14 ms | 3136 KB |
2 | 答案正确 | 3 | 15 ms | 3256 KB |
3 | 答案正确 | 2 | 16 ms | 3264 KB |
4 | 答案正确 | 2 | 15 ms | 3268 KB |