编程题练习@8-23

分享8月23日两道编程题:

1 开幕式排列

题目描述
导演在组织进行大运会开幕式的排练,其中一个环节是需要参演人员围成一个环形。
演出人员站成了一圈,出于美观度的考虑,导演不希望某一个演员身边的其他人比他低太多或者高太多。
现在给出n个参演人员的身高,问在他们站成一圈时,相邻演员的身高差的最大值至少是多少?请你帮忙计算。
输入描述
输入包括两行,第一行有1个正整数,代表人数n。
第二行有n个空格隔开的正整数h;表示第i个演员的身高。
输出描述
输出包括一个正整数,表示答案。

样例1
输入
5
2 1 1 3 2
输出
1
样例2
输入
2
10 20
输出
10

代码如下:

def minDifference(n, nums):
    nums.sort()
    res = nums[n - 1] - nums[n - 2]

    for i in range(n - 2, 0, -1):
        if i == 1:
            res = max(res, abs(nums[i] - nums[i - 1]))
        else:
            res = max(res, abs(nums[i] - nums[i - 2]))
    return res

if __name__ == '__main__':
    n = int(input())
    nums = list(map(int, input().split()))
    print(minDifference(n, nums))

2 最少数字

题目描述
小明用计算机随机生成了N个正整数,他希望从这N个数中选取若干个数,使得它们的和等于M。这些随机生成的数字可能会相同,但是每个数字最多只允许使用一次当然这样的选取方案可能不存在,也可能有多个。
现在希望你编写一个程序,能够找出数字个数最少的选取方案,输出对应的最少数字的个数,如果无 解输出“No solution” 。
输入描述
单组输入,每组输入2行。
第1行包含两个正整数N和M,分别表示初始输入的正整数个数和目标数字和(N<=1e3,M<=1e5)。
第2行为N个正整数,两两之间用空格隔开(每一个正整数均小于等于1e5)。
输出描述
输出数字个数最少的选取方案中所包含的最少数字个数,如果无解输出“No solution”。

样例1
输入
5 5
1 3 2 1 1
输出
2

代码如下:

def find_min_nums_for_sum(nums, target):
    dp = [float('inf')] * (target + 1)
    dp[0] = 0

    for num in nums:
        for j in range(target, num - 1, -1):
            if dp[j - num] != float('inf'):
                dp[j] = min(dp[j], dp[j - num] + 1)

    return dp[target] if dp[target] != float('inf') else 'No solution'

if __name__ == '__main__':
    N, M = map(int, input().split())
    nums = list(map(int, input().split()))
    print(find_min_nums_for_sum(nums, M))

你可能感兴趣的:(算法,数据结构,python)