借鉴一些牛友和自己的思想,整理了一下前5道题的python实现,没有测试过是否AC,所以不确定代码中有没有不通过的case,恳请大佬指正,轻喷谢谢~
1.一个数分成几份,可以被 3 整除的最大份数。比如 12345 分成12 3 45 结果为3.
思路:贪心算法
n = input()
m = 0 # 计数
string = '' # 字符组合
c1,c2 = 0,0 # 余数分别为1和2的情况
for i in range(len(n)):
if int(n[i]) % 3 == 0:
m += 1
string = ''
c1,c2=0,0
continue
string += n[i]
if int(n[i]) % 3 == 1:
c1 += 1
else:
c2 += 1
if (string != '' and int(string) % 3 == 0) or (c1>0 and c2>0):
m += 1
string = ''
c1,c2=0,0
print(m)
2.根据x + y = x|y,给定x, 求满足要求的第 k 个 y
不是很懂位运算,所以就简单粗暴的枚举了
t = int(input()) # 表示输入t组数据
l_in = []
for i in range(t):
x,k = input().strip().split() # 每组数据的x和k
a = [int(x),int(k)]
l_in.append(a) # 所有组数据的列表
for ax in l_in:
l_out = []
y = 1
while y > 0 and len(l_out) < ax[1]: 当l_out长度达到k时就停止
if ax[0] + y == ax[0] | y:
l_out.append(y)
y += 1
else:
y += 1
print(l_out[-1]) # 打印出每组数据符合的第k个数据
3.给定数组[0-9] 和 boll_array[0111011110], 0表示可以输出,也可以不输出, 1必须输出对应位,输出所有可能情况(按字符串升序)
import copy
# a = [0,1,2,3,4,5,6,7,8,9] # 数字数组
# b = [0,1,1,1,0,1,1,1,1,0] # 对应的布尔值数组
b = list(map(int,input().strip().split()))
index = []
for i in range(0,len(b)):
if b[i] == 1:
b[i] = str(i) # 将布尔值为1的位置赋予对应的数值
if b[i] == 0:
index.append(i) # 记录布尔值为0的位置索引
b[i] = '' # 同时赋予空
res = [b]
for ind in index:
for i in range(len(res)):
c= copy.copy(res[i])
c[ind] = str(ind) # 对结果列表中的每个组合依次添加布尔值为0的位置所对应的数字
res.append(c)
for i in range(len(res)):
res[i] = ''.join(res[i])
res.sort() # 排序
for i in res:
print(i)
4.n 面筛子,m面有奖,有奖继续掷筛子,没奖结束。输入给定每面分数的数组 s, len(s) = n, 求期望。
数学题, ave_score = sum(s)/n
e = (n-m)/n avg_score (第一次就没奖)+ m/n (avg_score + e) (第一次有奖,相当于从头开始)
化简得到 e = sum(s_array)/n-m
n,m = input().strip().split()
sc = list(map(int,input().strip().split()))
e = sum(sc)/(int(n) - int(m))
print('%.2f' % e)
5.最大上升子序列和
a = [5,1,3,4,9,7,6,8]
a = list(map(int,input().strip().split()))
n = len(a)
d = [0 for i in range(n)] # 子序列最后一个元素值为a[i]时,对应的最大子序列和d[i]
d[0] = a[0]
for i in range(1,len(a)):
s = []
for j in range(i):
if a[i] > a[j]: # 找出子序列最后一个元素值小于当前元素的所有子序列
s.append(d[j]+a[i])
else:
s.append(a[i])
d[i] = max(s)
# print(d)
print(max(d))