分糖果
问题描述
最近暑期特训算法班的同学们表现出色,他们的老师肖恩决定给他们分发糖果。肖恩购买了 个不同种类的糖果,用小写的阿拉伯字母表示。每个糖果必须分发给一个同学,并且每个同学至少要分到一个糖果。同学们的开心程度定义为他们所分到的糖果组成的字符串 的字典序。肖恩希望同学们的开心程度相差尽量小,因此他要找到一种方案,使得所有糖果组成的字符串中字典序最大的字符串尽可能小。
请输出能够实现字典序最小可能的max 。
样例输入
6 2
caabdc
样例输出
abccd
代码
n, x = map(int, input().split()) s = sorted(input()) if s[0] != s[x - 1]: print(s[x - 1]) elif s[x] == s[-1]: print(''.join(s[0::x])) else: print(''.join(s[x - 1:]))
最小化战斗力差距
问题描述
小蓝是机甲战队的队长,他手下共有 名队员,每名队员都有一个战斗力值 。现在他需要将这 名队友分成两组 和 ,分组必须满足以下条件:
- 每个队友都属于a 组或b 组。
- a组和 b组都不为空。
- 战斗力差距最小。
样例输入
3
1 2 3
样例输出
1
代码
n = int(input()) a = sorted(map(int, input().split())) print(min(a[i] - a[i - 1] for i in range(1, n)))
小蓝的零花钱
问题描述
小蓝和小桥正在玩一个游戏,他们有一个长度为 的序列,其中既有偶数也有奇数,且偶数和奇数的数量相等。小蓝有一些零花钱,他可以用这些钱来做一个特殊的操作:他在序列中选取一个位置,然后在这个位置上将序列分成两段,要求每一段中偶数和奇数的数量都相等。小蓝想要用他的零花钱尽可能多地进行这个操作,但每次操作都需要花费代价。具体而言,每次选取的位置可以看成是对序列进行切割,切割需要花费的代价为切割两端的元素的差的绝对值。小蓝想知道,在他的预算范围内,最多能进行多少次操作。
请你帮助小蓝计算最多可以进行的操作次数。
样例输入
6 3
1 2 3 4 5 6
样例输出
2
代码
n, m = map(int, input().split()) a = list(map(int, input().split())) cnt = 0 pos_l = [] for i in range(n - 1): cnt += 1 if a[i] % 2 else -1 if cnt == 0: pos_l.append(i) s = sorted(abs(a[i] - a[i + 1]) for i in pos_l) ans = 0 for i in s: if m - i < 0: break m -= i ans += 1 print(ans)
希尔排序模板题
问题描述
希尔排序是直接插入排序算法的一种更高效的改进版本,但它是非稳定排序算法。希尔排序是基于插入排序的以下两点性质而提出的改进方法之一:
1. 插入排序在对几乎已经排好序的数据操作时,效果是非常好的。
2. 插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。
而通常对于希尔排序中我们选择增量序列为: ,其中 为待排序数组的长度。
现在,给你一个整数数组,要求使用希尔排序算法对它进行排序。
样例输入
5
5 2 9 1 5
样例输出
1 2 5 5 9
代码
def shell_sort(a, steps): for step in steps: for i in range(step, len(a)): for j in range(i, step - 1, -step): if a[j] < a[j - step]: a[j], a[j - step] = a[j - step], a[j] else: break n = int(input()) a = list(map(int, input().split())) steps = [n // (1 << i) for i in range(n.bit_length())] shell_sort(a, steps) print(*a)