算法练习- 其他算法练习6

文章目录

  • 数字序列比大小
  • 最佳植树距离
  • 文艺汇演

数字序列比大小

  • A、B两人一人一个整数数组,长度相等,元素随即;
  • 两人随便拿出一个元素(弹出),比较大小,赢的得一分,输的减去一分,否则分值都不变;
  • B每取一个元素都明示,求A赢B时的最大分值;

输入:
n 数组长度
arr1
arr2
输出:
求A赢B时的最大分值

示例1
输入:
3
4 8 10
3 6 4
输出:
3

示例2
输入:
4
3 6 2 10
2 5 7 11
输出:
3

思路:

  • 对两个数组排序,并使用一个flag表示A 有能赢B 的元素;
  • arr_b弹出第一个值,arr_a中取能赢arr_b的最小值;
  • score_a 累加1;
  • 示例可以找arr_a排序后元素全小于arr_b;全大于arr_b;有大于有小于arr_b;

python:

n = int(input().strip())
arr_a = list(map(int, input().strip().split()))
arr_b = list(map(int, input().strip().split()))
arr_a.sort()
arr_b.sort()

score_a = score_b = 0

flag = True # 表示A能赢B
while flag and arr_b:
    flag = False
    e_b = arr_b.pop(0)
    i = 0

    # 取保证A赢的最小元素
    while i < len(arr_a) and arr_a[i] <= e_b: # 只有大于才算赢
        i += 1

    if i < len(arr_a):
        flag = True
        arr_a.pop(i)
        score_a += 1
        score_b -= 1


print(score_a)

 

最佳植树距离

  • 给定一些适合种树的坐标点和树苗数量;
  • 让树苗均匀分开,确定最佳的种树距离;

示例1
输入:
7 坐标的数量
1 5 3 6 10 7 13 坐标
3 树苗数量
输出:
6 最佳的植树距离

思路:

  • coords坐标数组升序排序;
  • 植树距离最小为1,最大max_dist为【最大坐标-最小坐标】;
  • for dist in range(1, max_dist+1);
    • for i in range(coords[0], coords[-1]+1, dist):
    • used_trees += 1 并且保存植树的坐标位置
  • used_tree > has_tree continue;
  • used_tree == has_tree 判断是否合法坐标;
  • used_tree < has_tree 距离太大 break

python:


coord_n = int(input().strip())
coords = list(map(int, input().strip().split()))
coords.sort()
trees_m = int(input().strip())

find_best_dist = False

max_dist = coords[-1] - coords[0]
dist = 1
for dist in range(1, max_dist+1):
    used_trees = 0
    pos_list = []
    for i in range(coords[0], coords[-1] + 1, dist):
        used_trees += 1
        pos_list.append(i)
    if used_trees > trees_m: # 说明当前间距太小
        continue

    elif used_trees == trees_m:
        # 如果当前位置都是有效位置,且以均匀种植完所有的树苗,则break
        if all([True if i in coords else False for i in pos_list]):
            find_best_dist = True
            break
    else:
        break

if find_best_dist:
    print(dist)
else:
    print(-1)

 

文艺汇演

  • 一个人只能观看一场演出,不能迟到、早退;
  • 连续观看的演出至少有15分钟的间隔;
  • 根据时间表,计算最多可以看几场演出;

示例1
输入:
2 演出场数
720 120 开始时间-持续时间
840 120 开始时间-持续时间
输出:
1

示例2
输入:
5
20 120
80 120
130 70
140 60
200 50
输出:
2

思路:

  • xx

python:


if __name__ == '__main__':
    n = int(input().strip())
    plays = []
    for i in range(n):
        start_last = list(map(int, input().strip().split()))
        plays.append(start_last)
    plays = sorted(plays, key=lambda i:i[0])
    print(plays)

    can_see = [plays[0]]
    for i in range(1, n):
        last = can_see[-1]
        if plays[i][0] - (last[0] + last[1]) >= 15:
            can_see.append(plays[i])

    print(len(can_see))

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