第一题 求和:求1(含)至20230408(含)每一个数的和
代码:
print(sum(range(20230409))
第二题 分糖果:一个有n个糖果,这n个糖果是不同种类的,分别用小写字母 'a' 至 'z'表示。班上有x个同学,每个同学至少分到一个糖果,每个糖果必须发个一位同学。每个同学的开心程度定义为所分到糖果所组成字符串s[i]的字典序。如果想要同学们的开心程度相差尽量小,分配方案则是使得所有糖果所组成的字符串的字典序最大的字符串尽可能小。即,输出最小的max(s[1], ..., s[x])。
问题分析:首先,需要明确字典序的定义。字典序是指字符串中的字母按照字典上的顺序排序大小。对于两个字符串比较字典序,首先比较第一个字符,若第一个字符不同,则第一个字符字典序较大的那个字符串整体的字典序大于另一个字符串;若相同,则继续比较下一个字符,直到有字符不相同或者一个字符串已经达到最大长度结束,此时前者按照之前的比较方式即可,后者则较短的字符串的字典序排在较长的前面(注意:不能直接根据长短定义字典序,而是要当较短字符串为较长字符串的前缀时才能如此)。
本题的解决思路如下:首先将糖果进行排序,得到排序好的糖果数组。然后,在排序好的数组中先比较第一个糖果和第x个糖果的大小,如果出现不同,则直接输出第x个糖果为所需要的结果(第一种情况); 如果相同,则表明前x个糖果都相同,则继续比较第x+1个糖果和最后一个糖果的字典序大小:如果相同,则表明后续糖果都是一样,则从第一个糖果开始每隔x个糖果输出一次就能得到所求结果;如果不同,则直接输出第x糖果到最后一个糖果(这样做的理由是,因为在数组中越靠后的糖果,字典序越大,而为了找到最小的最大糖果字符串,我们需要让大字典序的糖果在字符串出现的位置越靠后越好,这样他对于字符串的字典序的大小影响越小)
代码如下:
import os import sys n, x = map(int, input().split()) S = input() # 对S进行排序 S = sorted(S) # 比较前x个糖果 if S[0] != S[x-1]: print(S[x-1]) # 比较第x+1个糖果和最后一个糖果 elif S[x]==S[-1]: print(''.join(S[::x])) else: print(''.join(S[x-1:]))