我把自己做的贴出来了,麻烦各位大佬看看,第二题和第三题怎么做呀?本小白很想知道正确答案┭┮﹏┭┮
第三题想法是 对半收益最大,但是测试用例都过不了。有大佬知道问题出在哪儿了吗
第一题:三位数转 逆序的二进制编码
小招喵是一个商业巨腕,手下有n个公司,每-一个公司他
都对其有一个三位数编码,但是他现在想到了一种新的
编码方式。
即原来的三位数的每一位数字0~9, 对应成4位二进制编
码,例如1对应0001, 2对应0010, 5对应0101, 9对应1001.
那么三位数(可能小于百, 默认前导为0)
例如:
123对应000100100011
891对应100010010001
76对应00001110110
5对应00000000101
小招喵为了让别人不觉得他的新编码太没新意,他要求
上述编码后的二进制串进行镜像反转(首尾反转),并且去
除前导0,作为最终编码。小招喵忙于管理公司,让你帮
做。
输入:
10 1 2 3 123 5 8 999 777 156 95
输出:
100000000000 10000000000 110000000000 110001001000 101000000000 100000000 100110011001 111011101110 11010101000 101010010000
自己还是太菜了
想了一个小时,才勉强做出来
难点一:十进制转二进制编码现推
难点二:字符串位数不够 怎么补全, ljust()、rjust()函数
难点三:找到字符串中第一个指定元素的索引 find()函数
n = int(input()) nums = [item for item in input().strip().split()] def bianma(num): bm = '' while num: bm += str(num % 2) num //= 2 bm = bm.ljust(4, '0') bm = bm[::-1] return bm for i in range(n): num = nums[i] l = len(num) # 每个数有多少位 ans = '' for j in range(l): ans += bianma(int(num[j])) # 把每一位数字对应的二进制编码连接在一起 ans = ans.rjust(12, '0') ans = ans[::-1] index = ans.find('1') ans = ans[index:] print(ans)
第二题:字母填充序列
■题目描述
小招喵想要把k种不同的小写字母填到长度为n的序列中,对于每个小写字母,他可以使用多次,并且这k种字母都要出现,同时他还需要保证任意两个相邻的字母不相同。小招喵想知道此时字典序最小的方案是什么,或者这根本不可能得到。
输入描述:
两个整数n,k。分别表示序列长度以及字符集大小 1≤ n ≤105, 1≤ k ≤26
输出描述:
若不存在一个合法的方案,则输出-1 否则输出一行字符串表示答案
示例1:
输入输出示例仅供调试,后台判题数据一般不包含示例
输入:
6 2
输出:
ababab
解答:
无
不会
不知道怎么得到字母表,莫非要一个一个打出来?
其次不知道怎么放置字母的位置
--------第一次更新 18:30
根据评论区的大佬赐教,这一题有了一点想法,就是
- 1、如果n < k,字母比位置多,指定没法放,返回 -1
- 2、如果 n == k,一个坑一个字母
- 3、如果n > k,要想相邻字母不一样且字典序最小,那么前面的字母都可以循环用ab填充,最后空出一些位置 留给k-2个字母填充(从c开始数 一直到指定的字母个数)
- Python 使用 chr(i+96)得到i对应位置的字母,如chr(1+96)对应字母a
最后贴上自己啰里啰嗦的代码,如果有大佬代码更简洁的话,麻烦赐教一下哈哈n,k = [int(item) for item in input().strip().split()] if n < k: print(-1) elif n == k: ans = '' for i in range(1,n+1): ans += chr(i + 96) print(ans) else: kk = k - 2 ans = '' for i in range(n-kk): if i % 2 == 0: ans += 'a' else: ans += 'b' for i in range(3, 3+kk): ans += chr(i + 96) print(ans)
第三题:最大收益
题目描述
一开始有一 个大小为s的史莱姆,每次可以从现有的史莱
姆中选择一个大小大于 1的史莱姆,设它的大小为k,将它分裂成a和k- a(1≤a
给定s, m,求最少分裂几次才能得到至少m的收益,如果无法达到输出-1。
输入描述:
一行两个数字s, m.
输出描述:
一行一个数字表示答案
示例1、输入输出示例仅供调试, 后台判题数据一般不包
含示例
输入
33343434
输出
4
我想的是 对半分,但是好像不对,因为和示例的输出对不上
所以也不知道究竟该怎么做了
s,m = [int(item) for item in input().strip().split()] # 对半分 相乘的收益最大 a_m = 0 count = 0 nums = [] nums.append(s) while max(nums) > 1 and a_m < m: nums.sort() print(nums) k = nums[-1] print('k',k) nums.pop() a_m += (k // 2) * (k - k//2) print(k//2,k-k//2) print('a_m',a_m) nums.append(k//2) nums.append(k-k//2) count += 1 if a_m < m: print(-1) else: print(count - 1) # -1 变成通过 60%,不减1 通过 20%
最后,再次跪求会做的大佬们给点思路┭┮﹏┭┮,麻烦啦
全部评论
(7) 回帖