首页 > 招行竞赛初赛 哇哇哇 麻烦大佬们看过来
头像
MMoffer
编辑于 2020-08-03 18:38
+ 关注

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

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

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

小招喵是一个商业巨腕,手下有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) 回帖
加载中...
话题 回帖

推荐话题

相关热帖

近期热帖

历年真题 真题热练榜 24小时
技术(软件)/信息技术类
查看全部

近期精华帖

热门推荐