第一题:
题目描述:现有红绿两种颜色的石头,现在我们需要用这两种石头搭建一个塔,塔需要满足如下三个条件:1,第一层应该包含1块石头,第二层应该包含两块,第i块需要包含i块石头;2,同一层的石头应该是同一个颜色(红或绿);3,塔的层数尽可能多。问在满足上述三个条件的前提下,有多少种不同的建造塔的方案,当塔中任意一个对应位置的石头颜色不同,我们就认为这两个方案不相同。石头可以不用完。 输入:输入仅包含两个正整数,分别表示红和绿砖块的数量a,b(0<=a,b<=2*10**5,a+b>=1)输出:输出和仅包含一个正整数,表示不同的方案数对10**7取模的结果。
输入样例1:4 6输出样例1:2 输入样例2:20 122输出样例2:192 处理程序:缺点:时间复杂度高、空间复杂度高。需要后续进行优化
1 # *** 辅助函数 *** # 2 def select_index(COUNTER, i, num): 3 line0 = list(range(1, COUNTER + 1)) 4 line1 = list(combinations(line0, i)) 5 line2 = [] 6 for j in line1: 7 data = [x for x in j] 8 if sum(data) == num: 9 line2.append(data) 10 return line2 11 12 13 def select_sub(line0, DIF): 14 for i in range(1, len(line0) + 1): 15 line1 = list(combinations(line0, i)) 16 line2 = [] 17 for j in line1: 18 data = [x for x in j] 19 if sum(data) <= DIF: 20 line2.append(data) 21 return line2 22 23 24 # *** 数据输入 *** # 25 d0 = list(map(int, input().split())) 26 MIN, MAX, SUM = min(d0), max(d0), sum(d0) 27 COUNTER, SUM_TOWER = 0, 0 28 while True: 29 COUNTER += 1 30 SUM_TOWER += COUNTER 31 if SUM_TOWER > SUM: 32 SUM_TOWER -= COUNTER 33 COUNTER -= 1 34 break 35 DIF = SUM - SUM_TOWER 36 37 # *** 数据处理 *** # 38 d1 = [] # 最小个数的个数 39 for i in range(1, COUNTER + 1): 40 d_mid = select_index(COUNTER, i, MIN) 41 d1.extend(d_mid) 42 # print(d1) 43 44 d2 = [] 45 for line0 in d1: 46 d_mid = select_sub(line0, DIF) 47 d2.extend(d_mid) 48 # print(d2) 49 50 # *** 数据输出 *** # 51 if MIN == 0 and MAX == 0: 52 print(0) 53 elif MIN == 0 and MAX > 0: 54 print(1) 55 else: 56 print((len(d1) + len(d2)) % 10**7)
第二题:
题目描述:拉齐有01序列,他可以对这个序列进行任意多次变换,每次变换都是把序列的最后若干个元素放到最前面,例如:01001,将最后3个元素011放到最前面,序列变为011010。所有变换结束后,拉齐需要挑选出一个全为1的连续区间,要求最大化区间长度。 输入:共一行,一个01串,仅包含0或1.序列长度不超过50000。输出:一个整数,表示最长区间的长度。
输入样例1:11011输出样例1:4 输入样例2:11111输出样例2:5 输入样例3:000000000000输出样例3:0 输入样例4:1输出样例4:1 输入样例5:0输出样例5:0
1 while True: 2 try: 3 LIST = input() 4 if ‘0‘ in LIST: 5 index_ones = LIST.index(‘0‘) 6 index_now = index_ones 7 max = index_now 8 9 while True: 10 if ‘1‘ not in LIST[index_now:]: 11 break 12 13 index_start = LIST[index_now:].index(‘1‘) 14 index_now += index_start 15 16 if ‘0‘ not in LIST[index_now:]: # 后面全部是1并且结尾 17 if max < (index_ones + len(LIST) - index_now): 18 max = (index_ones + len(LIST) - index_now) 19 break 20 21 index_end = LIST[index_now:].index(‘0‘) 22 index_now += index_end 23 if max < index_end: 24 max = index_end 25 26 print(max) 27 28 else: 29 print(len(LIST)) 30 31 except: 32 break
原文地址:https://www.cnblogs.com/Mufasa/p/10706803.html
时间: 2024-10-09 12:15:29