一.编程题1-20分
题目描述:
小招喵是一个商业巨腕,手下有n个公司,每一个公司他都对其有一个三位数编码,但是他现在想到了一种新的编码方式。
即原来的三位数的每一位数字0~9, 对应成4位二进制编码,
例如1对应0001,2对应0010,5对应0101,9对应1001.
那么三位数(可能小于一百,默认前导为0)
例如:
123对应000100100011
891对应100010010001
76对应000001110110
5对应000000000101
小招喵为了让别人不觉得他的新编码太没新意,他要求上述编码后的二进制串进行镜像反转(首尾反转),并且去除前导0,作为最终编码。小招喵忙于管理公司,让你帮忙处理出他每一个公司编码处理后的新编码是什么?

输入描述:

第一行一个整数n,1<=n<=100
第二行n个整数ai,0<=a<=999

输出描述:
n行,每一行代表原编码为ai对应的新编码

示例1:
输入:
10
1 2 3 123 5 8 999 777 156 95

输出:
100000000000
10000000000
110000000000
110001001000
101000000000
100000000
100110011001
111011101110
11010101000
101010010000

AC

n = int(input())

ls = list(map(int, input().split()))

for i in ls:
    if i==0:
        print(0)
    else:
        s=str(i)
        cur=""
        for j in s:
            cur_le=bin(int(j))[2:]
            cur_le="0"*(4-len(cur_le))+cur_le
            cur+=cur_le

        if len(cur)<12:
            cur="0"*(12-len(cur))+cur

        res=cur[::-1].lstrip('0')

        print(int(res))

二.编程题2-30分
题目描述:
小招喵想要把k种不同的小写字母填到长度为n的序列中,对于每个小写字母,他可以使用多次,并且这k种字母都要出现,同时他还需要保证任意两个相邻的字母不相同。
小招喵想知道此时字典序最小的方案是什么,或者这根本不可能得到。

输入描述:
两个整数n,k。分别表示序列长度以及字符集大小1≤n≤10^5,1≤k≤26

输出描述:
若不存在一个合法的方案,则输出-1
否则输出一行字符串表示答案

示例1
输入:
6 2
输出:
ababab

示例2
输入:
6 7
输出:
-1

import sys

n, k = [int(i) for i in sys.stdin.readline().strip().split()]

en_char = 'abcdefghijklmnopqrstuvwxyz'
if k == 1:
    if n == 1:
        print('a')
    else:
        print(-1)
else:
    if k > n:
        print(-1)
    else:
        res = []
        abflag = True
        for i in range(n - k + 2):
            if abflag:
                res.append('a')
                abflag = False
            else:
                res.append('b')
                abflag = True
        for i in range(k - 2):
            res.append(en_char[i + 2])
        print(''.join(res))

三.编程3-50分
题目描述:
一开始有一个大小为s的史莱姆,每次可以从现有的史莱姆中选择一个大小大于 1的史莱姆,设它的大小为k,将它分裂成a和k- a(1 <=a < k)大小的两个史莱姆,得到收益a*(k-a)。

给定s, m,求最少分裂几次才能得到至少m的收益,如果无法达到输出-1。

输入描述:
一行两个数字s,m。
2≤s≤10^3,1≤m≤10^9
输出描述:
一行一个数字表示答案

示例1
输入:
333 43434
输出:
4

s ,count = [int(i) for i in input().split(' ')]
#考虑特殊情况
if count==0:
    sum1=0
elif count<=s*s/4:
    sum1=1
else:
    c=0
    n=1
    while c<count:
        c=c+float(s**2/2**(n+1))
        n+=1 #计算批次N
    #计算第N批分裂的次数
    c=c-float(s**2/2**n) #此时c的值为前N-1批的能量和
    last=count-c
    n1=s/2**(n-1)
    n1=n1*n1
    n2=last//n1+1#第N批的分裂次数
    n=n-2
    #前N-1批的分裂次数加本批分裂次数
    sum1=2**n-1+n2
print(sum1)