第一题:农场养鸡
n个农场,第i个农场有a[i]只鸡,每天每个农场都会增加k只鸡。每晚农场主都会选择鸡最多的农场,将该农场鸡的个数除以2下取整,在m天后剩下多少只鸡?
输入:
第一行输入三个int类型n,m,k(1 <= n,m,k <= 10^6)
第二行输入n个正整数,表示n个养鸡场初始鸡的个数
输出:
输出鸡的总数
示例:
输入:
3 3 100
100 200 400
输出:
925
代码如下:
import numpy as np
import sys
def chicken(days, nums, k): # 编写养鸡函数
for i in range(days): # 循环天数
nums = [item+k for item in nums] # 每天每个笼子增加k只鸡
index = nums.index(np.max(nums)) # 找到鸡数目最大的笼子
nums[index] = nums[index]//2 # 鸡数目减半,用整数除法
return nums
if __name__ == '__main__':
line = sys.stdin.readline().split() # 获取第一行输入
n = int(line[0]) # 分别存储 n, m, k
m = int(line[1])
k = int(line[2])
nums = sys.stdin.readline().split() # 获取第二行输入,存储初始各笼鸡的数目
nums = [int(item) for item in nums] # 数目变为整形
nums = chicken(m, nums, k) # 调用养鸡函数
print(sum(nums)) # 输出数目
第二题:连续子序列最大值的期望
序列arr={a1,a2,…,an}的所有连续子序列最大值的期望是多少?(结果保留小数点后6位有效数字)
注意是连续子序列,序列是有原列表中连续的元素组成,这样难度降低。
示例:
输入:
4
2 3 1 5
输出:
3.500000
解释:
连续子序列和最大值分别为:
[2] 2
[2 3] 3
[2 3 1] 3
[2 3 1 5] 5
[3] 3
[3 1] 3
[3 1 5] 5
[1] 1
[1 5] 5
[5] 5
计算期望:(2+3*4+1+5*4)/10=3.500000
Python 代码示例:
import sys
def max_num(n, nums): # 求得包含各个子序列最大值出现次数的字典
num_dict = {}
for i in range(n): # 两层循环,用来划分连续子序列
for j in range(i, n):
max_value = max(nums[i:j+1]) # 求子序列最大值
if max_value in num_dict.keys(): # 添加进字典
num_dict[max_value] += 1
else:
num_dict[max_value] = 1
return num_dict
if __name__ == '__main__':
n = int(sys.stdin.readline()) # 获取整数型数列长度
nums = sys.stdin.readline().split()
nums = [int(item) for item in nums] # 获取序列,并将值转化为整型
num_dict = max_num(n, nums) # 调用函数,求得包含各个子序列最大值出现次数的字典
res = 0
key_num = 0
for key, value in num_dict.items(): # 求解最终结果
res += key*value # 最大值之和
key_num += value # 最大值个数
print('{:.6f}'.format(res/key_num)) # 最大值期望