招行竞赛初赛 哇哇哇 麻烦大佬们看过来

我把自己做的贴出来了,麻烦各位大佬看看,第二题和第三题怎么做呀?本小白很想知道正确答案┭┮﹏┭┮
第三题想法是 对半收益最大,但是测试用例都过不了。有大佬知道问题出在哪儿了吗

第一题:三位数转 逆序的二进制编码

小招喵是一个商业巨腕,手下有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%

最后,再次跪求会做的大佬们给点思路┭┮﹏┭┮,麻烦啦

#笔试题目##招商银行#
全部评论
第三题不是对半的想法。。对半过不了样例的,有点贪心的思路吧,但我也不是很会解释。首先申明一下我没在比赛写出来,因为实习期间感觉跑了太久不太好,用小trick过了60%就没做下去。自己现在的代码是可以过样例的,并且认为是可行的,但逻辑证明并没有,不排除有错。 拿样例来说,实际上最终分出来的几个数应该是相等的(或者差一),这个从对半开的角度可以去理解一下(我也是猜的)。 如果拆分n次,那么最终会有n+1个数,按照上面的逻辑,333就是变成66*2,67*3,然后按照这个拆分,去模拟步骤,首先拆成66*2+67和67*2,就是按照大数拆分尽量平均的原则。 那我们需要倒着去模拟,也就是每次把最小的两个数合并。 不知道怎么贴代码😥
1 回复 分享
发布于 2020-08-03 18:04
不知道python有没有类似字符串操作:1 + 'a'则为b,当然中间需要转换下,python可能可以通过char函数转,这个我不是很熟
点赞 回复 分享
发布于 2020-08-03 17:54
第二题我用的dp,dp[n][k]=dp[n-1][k-1]+a.charAt(k-1)
点赞 回复 分享
发布于 2020-08-03 18:44
第二题是这个意思吗
点赞 回复 分享
发布于 2020-08-03 20:01
楼主,这是卡中心那个吗,沃日,机会都没给我,哭晕在厕所
点赞 回复 分享
发布于 2020-08-03 20:16
代码没有了,这条博客这个思路,可以过第三题 https://blog.csdn.net/V5ZSQ/article/details/83583414
点赞 回复 分享
发布于 2020-08-04 16:44
第二题和第一题,土方法。。
点赞 回复 分享
发布于 2020-08-06 17:19

相关推荐

起名字真难233:这名字一看就比什么上海寻梦信息技术有限公司,北京三快网络技术有限公司等高级不少
点赞 评论 收藏
分享
评论
3
2
分享
牛客网
牛客企业服务