大鹏

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

 

 

 

 

 

 

 

 参考答案

  1 """
  2 其实这题就是0-1背包问题
  3 首先来看一下经典背包问题,稍作修改就可以得出这题的解答
  4 0-1背包问题
  5 问题描述:有一个背包可以装物品的总重量为W,现有N个物品,每个物品中w[i],价值v[i],用背包装物品,能装的最大价值是多少?
  6 定义状态转移数组dp[i][j],表示前i个物品,背包重量为j的情况下能装的最大价值。
  7 例如,dp[3][4]=6,表示用前3个物品装入重量为4的背包所能获得的最大价值为6,此时并不是3个物品全部装入,而是3个物品满足装入背包的条件下的最大价值。
  8 状态转移方程:
  9 dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]]+v[i])
 10 dp[i-1][j]表示当前物品不放入背包,dp[i-1][j-w[i]]+v[i]表示当前物品放入背包,即当前第i个物品要么放入背包,要么不放入背包。
 11 """
 12 """
 13 dp = [[0]*(n+1) for _ in range(m+1)]
 14 for i in range(1,m+1):
 15     for j in range(1,n+1):
 16         if j-w[i]>=0:
 17             dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]]+v[i])
 18         else:
 19             dp[i][j] = dp[i-1][j]
 20 return dp[m][n]
 21 """
 22 """
 23 现在来看下购物车的解题思路
 24 购物车本质上还是0-1背包问题,只不过多了主件和附件。假设先不看附件,那么就和0-1背包一样了。附件不能单独出现,要依赖于主件。
 25 对应于背包问题,主件的个数就是物品的个数,考虑每个主件时要考虑可能出现的情况。
 26 输入例子:
 27 1000 5
 28 800 2 0
 29 400 5 1
 30 300 5 1
 31 400 3 0
 32 500 2 0
 33 在当前的例子当中物品的个数就是3。
 34 考虑每个物品时要考虑每种可能出现的情况,1、主件,2、主件+附件1,3、主件+附件2,4、主件+附件1+附件2,不一定每种情况都出现,
 35 只有当存在附件时才会出现对应的情况。w[i][k]表示第i个物品的第k种情况,k的取值范围0~3,分别对应以上4中情况,
 36 v[i][k]表示第i个物品对应第k种情况的价值,现在就把购物车问题转化为了0-1背包问题。
 37 状态转移方程可以定义为
 38 dp[i][j] = max(dp[i-1][j],dp[i-1][j-w[i][k]]+v[i][k])
 39 dp[i-1][j]表示当前物品不放入背包,w[i][k]表示第i个主件对应第k中情况,即当前第i个物品的4中情况中价值最大的要么放入背包,要么不放入背包。
 40 需要注意:dp[i][j] = max(物品不放入背包,主件,主件+附件1,主件+附件2,主件+附件1+附件2)
 41 """
 42 """
 43 dp = [[0]*(n+1) for _ in range(m+1)]
 44 for i in range(1,m+1):
 45     for j in range(1,n+1):
 46         max_i = dp[i-1][j]
 47         for k in range(len(w[i])):
 48             if j-w[i][k]>=0:
 49                 max_i = max(max_i, dp[i-1][j-w[i][k]]+v[i][k])
 50         dp[i][j] = max_i
 51 print(dp[m][n])
 52 具体代码如下:
 53 
 54 """
 55 
 56 n, m = map(int, input().split())
 57 primary, annex = {}, {}
 58 for i in range(1, m + 1):
 59     x, y, z = map(int, input().split())
 60     if z == 0:  # 主件
 61         primary[i] = [x, y]
 62     else:  # 附件
 63         if z in annex:  # 第二个附件
 64             annex[z].append([x, y])
 65         else:  # 第一个附件
 66             annex[z] = [[x, y]]
 67 m = len(primary)  # 主件个数转化为物品个数
 68 dp = [[0] * (n + 1) for _ in range(m + 1)]
 69 w, v = [[]], [[]]
 70 for key in primary:
 71     w_temp, v_temp = [], []
 72     w_temp.append(primary[key][0])  # 1、主件
 73     v_temp.append(primary[key][0] * primary[key][1])
 74     if key in annex:  # 存在主件
 75         w_temp.append(w_temp[0] + annex[key][0][0])  # 2、主件+附件1
 76         v_temp.append(v_temp[0] + annex[key][0][0] * annex[key][0][1])
 77         if len(annex[key]) > 1:  # 存在两主件
 78             w_temp.append(w_temp[0] + annex[key][1][0])  # 3、主件+附件2
 79             v_temp.append(v_temp[0] + annex[key][1][0] * annex[key][1][1])
 80             w_temp.append(w_temp[0] + annex[key][0][0] + annex[key][1][0])  # 3、主件+附件1+附件2
 81             v_temp.append(v_temp[0] + annex[key][0][0] * annex[key][0][1] + annex[key][1][0] * annex[key][1][1])
 82     w.append(w_temp)
 83     v.append(v_temp)
 84 for i in range(1, m + 1):
 85     for j in range(10, n + 1, 10):  # 物品的价格是10的整数倍
 86         max_i = dp[i - 1][j]
 87         for k in range(len(w[i])):
 88             if j - w[i][k] >= 0:
 89                 max_i = max(max_i, dp[i - 1][j - w[i][k]] + v[i][k])
 90         dp[i][j] = max_i
 91 print(dp[m][n])
 92 
 93 """
 94 继续优化
 95 现在的时间复杂度是O(mn),时间复杂度已经无法优化,空间复杂度O(mn),可以继续优化到O(n)。
 96 回顾下状态转移方程:
 97 dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]]+v[i])
 98 dp[i]只依赖dp[i-1],状态转移方程就可以改为:
 99 dp[j] = max(dp_pre[j], dp_pre[j-w[i]]+v[i])
100 dp_pre[j]存储上一次得到的值,现在只需要2*n的空间就能得到结果。继续观察可以发现,其实只用一个一维dp数组就行,不需要额外的辅助数组。
101 让j从n到1遍历,此时每次更新的dp[j]时,max函数中dp[j]和 dp[j-w[i]]都是上次保存的值。
102 状态转移方程变为:
103 for j in [n...1]:
104 dp[j] = max(dp[j], dp[j-w[i]]+v[i])
105 如果从1到n遍历的话dp[j-w[i]]不能保证还是上次的值,这也进一步说明为什么用一维数组时需要从n到1遍历。
106 优化后的代码如下:
107 """
108 
109 n, m = map(int, input().split())
110 primary, annex = {}, {}
111 for i in range(1, m + 1):
112     x, y, z = map(int, input().split())
113     if z == 0:
114         primary[i] = [x, y]
115     else:
116         if z in annex:
117             annex[z].append([x, y])
118         else:
119             annex[z] = [[x, y]]
120 dp = [0] * (n + 1)
121 for key in primary:
122     w, v = [], []
123     w.append(primary[key][0])  # 1、主件
124     v.append(primary[key][0] * primary[key][1])
125     if key in annex:  # 存在附件
126         w.append(w[0] + annex[key][0][0])  # 2、主件+附件1
127         v.append(v[0] + annex[key][0][0] * annex[key][0][1])
128         if len(annex[key]) > 1:  # 附件个数为2
129             w.append(w[0] + annex[key][1][0])  # 3、主件+附件2
130             v.append(v[0] + annex[key][1][0] * annex[key][1][1])
131             w.append(w[0] + annex[key][0][0] + annex[key][1][0])  # 4、主件+附件1+附件2
132             v.append(v[0] + annex[key][0][0] * annex[key][0][1] + annex[key][1][0] * annex[key][1][1])
133     for j in range(n, -1, -10):  # 物品的价格是10的整数倍
134         for k in range(len(w)):
135             if j - w[k] >= 0:
136                 dp[j] = max(dp[j], dp[j - w[k]] + v[k])
137 print(dp[n])
View Code

 参考1

 

 

 

 1 #我的
 2 import re
 3 s = input()
 4 ss =s.split(";")
 5 print(ss)
 6 L1=[]
 7 x=0
 8 y=0
 9 powid=(x,y)
10 
11 for i in ss:
12     if re.search('^[ASWD]{1}\d{1,2}$',i):
13         L1.append(i)
14 print(L1)
15 
16 
17 
18 for j in L1:
19     if re.split('\d+',i)[0]=='A':
20         x =x-int(re.split('^A')[1])
21 
22     elif re.split('\d+',i)[0]=='S':
23         y=y-int(re.split('^S')[1])
24 
25     elif re.split('\d+',i)[0]=='D':
26         x=x+int(re.split('^D')[1])
27 
28     elif re.split('\d+',i)[0]=='W':
29         y=y+int(re.split('^W')[1])
30 
31 print(x,y)
32 
33 
34 ####################################################################
35 import re
36 
37 coord = input().split(";")
38 coord = filter(lambda x: re.match("^[ASDW]{1}\d{1,2}$", x), coord)
39 a, b = 0, 0
40 for c in coord:
41     if c[0] == "W":
42         b += int(c[1:])
43     elif c[0] == "S":
44         b -= int(c[1:])
45     elif c[0] == "A":
46         a -= int(c[1:])
47     elif c[0] == "D":
48         a += int(c[1:])
49 
50 print("{},{}".format(a, b))
51 ####################################################################
52 input_list = input().split(';')
53 initial = [0,0]
54 
55 for item in input_list:
56     if not 2 <= len(item) <= 3:
57         continue
58 
59     try:
60         direction = item[0]
61         step = int(item[1:])
62         if direction in ['A', 'D', 'W', 'S']:
63             if 0 <= step <= 99:
64                 if direction == 'A':
65                     initial[0] -= step
66                 elif direction == 'D':
67                     initial[0] += step
68                 elif direction == 'S':
69                     initial[1] -= step
70                 elif direction == 'W':
71                     initial[1] += step
72     except:
73         continue
74 
75 print(str(initial[0]) + ',' + str(initial[1]))
76 
77 ###########################################################
78 
79 #不成熟
80 import re
81 d = input().split(";")
82 result = [0,0]
83 
84 regex = re.compile(r'1[1-9]?[0-9]$')
85 l = []
86 for s in d:
87     if regex.match(s):
88         l.append(s)
89 for item in l:
90     letter = item[0]
91     if letter == "A":
92         result[0] = result[0]-int(item[1:])
93     elif letter == "D":
94         result[0] = result[0]+int(item[1:])
95     elif letter == "S":
96         result[1] = result[1]-int(item[1:])
97     else: result[1] = result[1]+int(item[1:])
98 
99 print(str(result[0]) + ',' + str(result[1]))
参考答案

 

 

 

 

 

  1 def check(s):
  2     if len(s) <= 8:
  3         return 0
  4     a, b, c, d = 0, 0, 0, 0
  5     for item in s:
  6         if ord('a') <= ord(item) <= ord('z'):
  7             a = 1
  8         elif ord('A') <= ord(item) <= ord('Z'):
  9             b = 1
 10         elif ord('0') <= ord(item) <= ord('9'):
 11             c = 1
 12         else:
 13             d = 1
 14     if a + b + c + d < 3:
 15         return 0
 16     for i in range(len(s)-3):
 17         if len(s.split(s[i:i+3])) >= 3:
 18             return 0
 19     return 1
 20 
 21 while 1:
 22     try:
 23         print('OK' if check(input()) else 'NG')
 24     except:
 25         break
 26 
 27 #########################################################
 28 #这个还是对那个重复性不一定就是3,每处理好
 29 
 30 def check(pw):
 31     if len(pw) <= 8:  # 判断密码的长度
 32         return False
 33 
 34     checks = [0, 0, 0, 0]  # 四种情况满足三种的辅助列表
 35     for c in pw:
 36         if c.isupper():  # 大写字母
 37             checks[0] = 1
 38         elif c.islower():  # 小写字母
 39             checks[1] = 1
 40         elif c.isdigit():  # 数字
 41             checks[2] = 1
 42         else:  # 其他字符
 43             checks[3] = 1
 44     if sum(checks) < 3:
 45         return False
 46 
 47     for i in range(len(pw) - 2):  # 循环遍历找到子字符串的起点
 48         if pw[i:i + 3] in pw[i + 3:]:  # 在剩下的字符串中顺序查找匹配当前字符串
 49             return False
 50 
 51     return True
 52 
 53 
 54 while True:
 55     try:
 56         pw = input()
 57         if check(pw):
 58             print('OK')
 59         else:
 60             print('NG')
 61     except:
 62         break
 63 #########################################################
 64 
 65 def CheckPasswd(passwd):
 66     # 检查长度
 67     if len(passwd) <= 8:
 68         return "NG"
 69     # 检查字符类型
 70     hasNum = 0
 71     hasLowercase = 0
 72     hasUppercase = 0
 73     hasOther = 0
 74     for i in range(len(passwd)):
 75         ascaii = ord(passwd[i])
 76         if ascaii >= ord('0') and ascaii <= ord('9'):
 77             hasNum = 1
 78         elif ascaii >= ord('a') and ascaii <= ord('z'):
 79             hasLowercase = 1
 80         elif ascaii >= ord('A') and ascaii <= ord('Z'):
 81             hasUppercase = 1
 82         else:
 83             hasOther = 1
 84     types = hasNum + hasLowercase + hasUppercase + hasOther
 85     if types < 3:
 86         return "NG"
 87 
 88     # 检查长度大于2的重复子串
 89     for i in range(len(passwd) - 3):  # 检查每个长度为3的子串是否重复出现即可
 90         substr = passwd[i:i + 3]
 91         if len(passwd.split(substr)) > 2:
 92             return "NG"
 93     return "OK"  # 三项条件都满足
 94 
 95 
 96 while 1:
 97     try:
 98         passwd = input().strip()
 99         print(CheckPasswd(passwd))
100     except EOFError:
101         break
102 
103 ################################################################3333
104 
105 def check(sub_pswd):
106     if len(sub_pswd) <=8:
107          return False
108     flag =[0,0,0,0]
109     for i in sub_pswd:
110         if '0'<= i <='9':
111             flag[0] = 1
112         elif 'A'<= i <='Z':
113             flag[1] = 1
114         elif 'a'<= i <='z':
115             flag[2] = 1
116         else:
117             flag[3] = 1
118     if sum(flag) >=3 :
119         for i in range(len(sub_pswd)-3):
120             if sub_pswd.count(sub_pswd[i:i+3]) >=2:
121                 return False
122         return True
123     else:
124         return False
125 
126 while True:
127     try:
128         pswd = input()
129         print('OK' if check(pswd) else 'NG')
130     except:
131         break
132 
133 ########################################################################
参考答案

 

 1 import re
 2 
 3 def check(password):
 4     if len(password) <=8:
 5         return 0
 6 
 7     a,b,c,d=0,0,0,0
 8 
 9     for i in password:
10         if re.search('[0-9]', i):
11             a=1
12         elif re.search('[A-Z]', i):
13             b=1
14         elif re.search('[a-z]', i):
15             c=1
16         elif re.search('[^A-Za-z0-9 \f\n\r\t\v]', i):
17             d=1
18 
19     if a+b+c+d<3:
20         return 0
21 
22     for j in range(3, len(password)):
23         if len(password.split(password[j:j + 3])) >= 3:
24             return 0
25     return 1
26 
27 while True:
28     try:
29         password = input()
30         print('Ok' if check(password) else 'NG')
31     except:
32         break
33         
34 ####################################################3
35 import re
36 password = input()
37 
38 if len(password) >8:
39     print('OK')
40 else:
41     print('NG')
42 
43 L1=[]  #数字
44 L2=[] #大写字母
45 L3=[] #小写字母
46 L4=[] #其他字符
47 
48 
49 for i in password:
50     if re.search('[0-9]',i):
51         L1.append(i)
52     elif  re.search('[A-Z]',i):
53         L2.append(i)
54     elif  re.search('[a-z]',i):
55         L3.append(i)
56     elif re.search('[^0-9a-zA-Z]', i):
57         #[^A-Za-z0-9 \f\n\r\t\v]
58         L4.append(i)
59 
60 if (len(L1) and len(L2) and len(L3)) == True:
61     print('OK')
62 elif (len(L1) and len(L2) and len(L4)) == True:
63     print('OK')
64 elif (len(L1) and len(L3) and len(L4)) == True:
65     print('OK')
66 elif (len(L2) and len(L3) and len(L4)) == True:
67     print('OK')
68 elif (len(L1) and len(L2) and len(L3) and len(L4)) == True:
69     print('OK')
70 else:
71     print('NG')
72 
73 
74 for j in range(len(password)):
75     for k in range(3,len(password)+1):
76         if password[j:j+3]==password[k:k+3]:
77 
78             print(password[j:j+3])
ME

 

 

 

 

 1 """
 2 #合唱队#
 3 此题是最长递增子序列的变体,基本思路是对原序列从左到右和从右到左分别求出到每个元素的最长递增子序列的长度。
 4 例如,原序列为长度为N的序列[8,20,12,15,10,9],从左至右的到序列里每个元素的最长递增子序列为l1=[1,2,2,3,2,2],
 5 从右至左为l2=[1,4,3,3,2,1],l1+l2=[2,6,5,6,4,3]。
 6 那么合唱队最长队伍是L = max(l1+l2)-1,减1是因为计算l1和l2时重复计算了一次元素本身。
 7 因此最少出列人数为原序列长度N-L。
 8 此题关键在于求出l1,l2。可由动态规划求出。用dp[i]表示从左至右到原序列第i个元素的最长递增子序列的长度,
 9 从第i个元素往回遍历更新dp[i]的值。由于每个元素都需要往回遍历一次,时间复杂度是o(n^2)。
10 往回遍历如何更新dp[i]的值在其他题解已有很好的介绍,这里主要写用二分法代替往回遍历的过程,时间复杂度是o(nlogn)。
11 二分法的过程为:首先创建数组arr=[ele_1],ele_1是原序列第一个元素,然后从第二个元素开始从左至右遍历原序列
12 如果ele_i > max(arr),将ele_i加到arr最后
13 如果ele_i <= max(arr),用二分法找到arr中第一个比ele_i大(或相等)的元素并用ele_i替换
14 遍历完成后arr的长度即为最长递增子序列的长度(但arr不是最长递增子序列)。
15 第二步替换是因为为遍历到的元素可能会有比ele_i大但比替换元素小的元素,比如原序列为[2,5,8,3,4,6]。
16 
17 """
18 
19 import bisect
20 def inc_max(l):
21     dp = [1]*len(l) # 初始化dp,最小递增子序列长度为1
22     arr = [l[0]] # 创建数组
23     for i in range(1,len(l)): # 从原序列第二个元素开始遍历
24         if l[i] > arr[-1]:
25             arr.append(l[i])
26             dp[i] = len(arr)
27         else:
28             pos = bisect.bisect_left(arr, l[i]) # 用二分法找到arr中第一个比ele_i大(或相等)的元素的位置
29             arr[pos] = l[i]
30             dp[i] = pos+1
31     return dp
32 
33 while True:
34     try:
35         N = int(input())
36         s = list(map(int, input().split()))
37         left_s = inc_max(s) # 从左至右
38         right_s = inc_max(s[::-1])[::-1] # 从右至左
39         sum_s = [left_s[i]+right_s[i]-1 for i in range(len(s))] # 相加并减去重复计算
40         print(str(N-max(sum_s)))
41     except:
42         break
43 
44 #######################################3
45 #参考了高赞的回答,为了加深自己的理解,手撸了一遍二分查找的代码。总的来说还是要自己敲一遍,一行行理解的快一些。
46 #二分查找,其中ls是从左到右升序
47 def find_pos(ls, num,start = 0, end = None):
48     if end == None:
49         end = len(ls)
50     while start < end:
51         index = (start+end)//2
52         if ls[index]<num:
53             start = index+1
54         else:
55             end = index
56     return start
57 
58 def dplist(raw_list):
59     dp = [1]*len(raw_list)
60     stu_list = [raw_list[0]]
61     for i in range(1,len(raw_list)):
62         if raw_list[i] > stu_list[-1]:
63             stu_list.append(raw_list[i])
64             dp[i] = len(stu_list)
65         else:
66             index = find_pos(stu_list,raw_list[i])
67             stu_list[index] = raw_list[i]
68             dp[i] = index+1
69     return dp
70 
71 while True:
72     try:
73         num =int(input())
74         ls = list(map(int,input().split()))
75         l_ls = dplist(ls)
76         r_ls = dplist(ls[::-1])[::-1]
77         total_ls = [l_ls[i]+r_ls[i]-1 for i in range(len(ls))]
78         print(num-max(total_ls))
79     except EOFError:
80         break
参考答案
  1 import sys
  2 
  3 
  4 # 获取最大增长子序列
  5 def get_max_up_sub_arr(count, arr):
  6     up_arr = [1 for x in range(count)]
  7     for i in range(count):
  8         for j in range(i):
  9             if arr[j] < arr[i]:
 10                 up_arr[i] = max(up_arr[i], up_arr[j]+1)
 11     return up_arr
 12 
 13 
 14 while True:
 15     try:
 16         count = int(input())
 17         arr = list(map(int, input().split(' ')))
 18         left_up_arr = get_max_up_sub_arr(count, arr)
 19         right_up_arr = get_max_up_sub_arr(count, arr[::-1])[::-1]
 20         print(count - max(i + j - 1 for i, j in zip(left_up_arr, right_up_arr)))
 21     except EOFError:
 22         break
 23 
 24 
 25 #######################################
 26 # 动态规划
 27 def lengthOfLIS(lst):
 28     dp = []
 29     for i in range(len(lst)):
 30         dp.append(1)
 31         for j in range(i):
 32             if lst[i] > lst[j]:
 33                 dp[i] = max(dp[i], dp[j] + 1)
 34     return dp # 每人左边可以站的人数
 35 
 36 while True:
 37     try:
 38         n, heights = int(input()), list(map(int, input().split()))
 39         # dp1:每人左边可以站的人数,dp2:每人右边可以站的人数
 40         dp1, dp2 = lengthOfLIS(heights), lengthOfLIS(heights[::-1])[::-1]
 41         res = []
 42         for i in range(len(dp1)):
 43             res.append(dp1[i] + dp2[i] - 1)
 44         print(n-max(res))
 45     except:
 46         break
 47 #############################################################
 48 
 49 import bisect #引入二分法
 50 def hcteam(l): #定义一个函数,寻找最长的子序列
 51     arr = [l[0]] #定义列表,将传入函数的列表第一个元素放入当前元素
 52     dp = [1]*len(l) #定义一个列表,默认子序列有当前元素1,长度是传入函数的列表长度
 53     for i in range(1,len(l)): #从第二个元素开始查找
 54         if l[i] > arr[-1]: #如果元素大于arr列表的最后一个元素,就把它插入列表末尾
 55             arr.append(l[i])
 56             dp[i] = len(arr)# 获取这个元素子序列的长度
 57         else: # 否则,利用二分法找到比元素大的元素的位置,用新的元素替代比它大的那个元素的值,这样就能制造出一个顺序排列的子序列
 58             pos = bisect.bisect_left(arr, l[i])
 59             arr[pos] = l[i]
 60             dp[i] =pos+1 # 获取这个元素子序列的长度
 61     return dp
 62 
 63 while True:
 64     try:
 65         n = int(input())
 66         sg = list(map(int,input().split()))
 67         left_t = hcteam(sg) #向左遍历查找子序列
 68         right_t = hcteam(sg[::-1])[::-1] #向右遍历查找子序列
 69         res = [left_t[i]+right_t[i]-1 for i in range(len(sg))] #因为左右都包含原元素,所以需要减1 ;得到各元素能得到的子序列的最大长度
 70         print(n-max(res)) # 源列表长度-可以生成的最长子序列长度  得到需要剔除的最小人数
 71     except:
 72         break
 73 #############################################################
 74 
 75 
 76 def find_len(b):
 77     nums = b
 78     if not nums:
 79         return 0
 80     dp = [1] * len(nums)#先初始化dp值,初始全设为1,初始只有自己
 81     for i in range(1, len(nums)):#从初始的右边的人开始
 82         for j in range(i):#从初始(第0个)到第j个人的左边
 83             if nums[i] > nums[j] and dp[i] < dp[j] + 1: #若是第i个人的身高大于第j个人,而且自己的左边是j的话[dp[j] + 1],得到的dp值大于自己本来得到的自己左边可以有多少人的计算[dp[i]]
 84                 dp[i] = dp[j] + 1 #那么i就加入j的排队序列
 85     return dp
 86 while True:
 87     try:
 88         student_num = int(input()) #输入需要排队的学生数
 89         student_tall = input() #输入所有的学生身高
 90         student_tall = student_tall.split()
 91         for i in range(student_num):
 92             student_tall[i] = int(student_tall[i]) #将输入的字符转化为整数
 93         len_all = []
 94         len_1 = find_len(student_tall) #获得正向(从小到大排序的dp),dp值即是每个学生的左边最多有几个人(包括自己)
 95         len_2 = find_len(student_tall[::-1]) #获得逆向从小到大(从大到小)len_2[::-1]代表每个学生的右边最多有几个人(包括自己)
 96         len_len_1 = len(len_1)
 97         len_3 = []
 98         for i in range(len_len_1):
 99             len_3.append(len_1[i] + len_2[::-1][i]) #两个相加就是每个学生的左右最多有几个人,结果包含两个自己
100         print(student_num - max(len_3) + 1)#按照输出要求,要得到踢出去几个人,所以需要len_3 -1 就是每个学生左右加上自己最多有几个人,取最大的那个学生的值,再用总数减去就是踢出去最少的人
101     except:
102         break
参考2
 1 data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35]
 2 
 3 
 4 def binary_search(dataset, find_num):
 5     print(dataset)
 6 
 7     if len(dataset) > 1:
 8         mid = int(len(dataset) / 2)
 9         if dataset[mid] == find_num:  # find it
10             print("找到数字", dataset[mid])
11         elif dataset[mid] > find_num:  # 找的数在mid左面
12             print("\033[31;1m找的数在mid[%s]左面\033[0m" % dataset[mid])
13             return binary_search(dataset[0:mid], find_num)
14         else:  # 找的数在mid右面
15             print("\033[32;1m找的数在mid[%s]右面\033[0m" % dataset[mid])
16             return binary_search(dataset[mid + 1:], find_num)
17     else:
18         if dataset[0] == find_num:  # find it
19             print("找到数字啦", dataset[0])
20         else:
21             print("没的分了,要找的数字[%s]不在列表里" % find_num)
22 
23 
24 binary_search(data, 66)
二分法

 

 

 

  1 import re
  2 while 1:
  3     try:
  4         s=input().strip()
  5         #把字母取出来,然后去重,排序,得到了字母序列
  6         sl=sorted(set([i.lower() for i in s if i.isalpha()]))
  7         #字母序列
  8         ll=[]
  9         for i in sl:
 10             ll+=re.findall(i,s,re.I)  #从字母表SL中取i,(同时忽略大小写)与原字符串匹配,找到了,就加入到新的字符串中,
 11         #字符串出现的每种字母按原序列添加到列表中
 12         for j in range(len(s)):
 13             if not s[j].isalpha():
 14                 ll.insert(j,s[j])  #将原来的非字母,插入到新字符串的在原字符串中的位置
 15         print(''.join(ll))
 16         #将非字母出现的位置设为原来的字符
 17     except:
 18         break
 19 
 20 #########################################################
 21 while True:
 22     try:
 23         a = input()
 24         zimu=''
 25         for i in a:
 26             if i.isalpha(): #至少有一个字符且所有字符为字母时返回True
 27                 zimu+=i
 28         zmpx=sorted(zimu,key=str.upper)#以字母转为大写后字符串升序排序的索引排列原字符串
 29         f=''
 30         idx=0
 31         for i in range(len(a)):
 32             if a[i].isalpha():
 33                 f+=zmpx[idx]
 34                 idx+=1
 35             else:
 36                 f+=a[i]
 37         print(f)
 38     except(EOFError,KeyboardInterrupt):
 39         break
 40 ###########################################
 41 while True:
 42     try:
 43         letter = input()
 44         letter_list = sorted([i for i in letter if i.isalpha()],key=lambda x:x.lower())
 45         print(*(letter_list.pop(0) if v.isalpha() else v for i,v in enumerate(letter)),sep='')
 46     except:
 47         break
 48 
 49 ###########################################
 50 while True:
 51     try:
 52         s = input()
 53         already, lst, dic = [], [], {}
 54         # 连接相同的字母(忽略大小写),将其添加到lst中,如['Bb', 'aA']
 55         # 同时用dic记录非字母字符的位置
 56         for i in range(len(s)):
 57             if not s[i].isalpha():
 58                 dic[i] = s[i]
 59                 continue
 60             if s[i].lower() not in already:
 61                 already.append(s[i].lower())
 62                 temp = s[i]
 63                 for j in range(i+1, len(s)):
 64                     if s[i].lower() == s[j].lower():
 65                         temp += s[j]
 66                 lst.append(temp)
 67         # 对lst进行冒泡排序
 68         for i in range(len(lst)-1):
 69             for j in range(i+1, len(lst)):
 70                 if lst[i].lower() > lst[j].lower():
 71                     lst[i], lst[j] = lst[j], lst[i]
 72         # 将非字母字符插入到原来位置
 73         lst = list(''.join(lst))
 74         for i in dic.keys():
 75             lst.insert(i, dic[i])
 76         print(''.join(lst))
 77     except:
 78         break
 79 
 80 
 81 #######################################################
 82 
 83 while True:
 84     try:
 85         a = input()
 86         a = list(a)
 87         s = []
 88         s_result = [0]*len(a)
 89         b = []
 90         for i in range(len(a)):
 91             if(a[i].isupper()): #若是大写字母,放入s
 92                 s.append(a[i])
 93             elif(a[i].islower()):#小写字母也放入s
 94                 s.append(a[i])
 95             else:
 96                 b.append(i) #若是其他的符号则标记它在a中的位置
 97         for i in b:
 98             s_result[i] = a[i] #在新设置的列表的同一位置放置其他的符号
 99         s_sort = []
100         for i in s:
101             s_sort.append([i.lower(),i]) #每一组是【对应的小写字母,字母】
102         s_sort.sort(key=lambda ele:ele[0]) #只按照对应的小写字母排序,这样规避了大小写,且同样的字母(不区分大小写)按照输入的顺序排序
103         s_new = []
104         for i in s_sort:
105             s_new.append(i[1]) #去掉对应的小写,保留原来的字母
106         j = 0
107         for i in range(len(s_result)):
108             if(s_result[i] == 0): #在新的列表里若是为初始设置的0,则认为这个位置应该是字母,按照排序后的字母按序插空即可
109                 s_result[i] = s_new[j]
110                 j = j + 1
111         print(''.join(s_result)) #按要求输出
112     except:
113         break
114 
115 
116 ###################################################
117 
118 #先解决仅有大小写字母没有其他字符串的案例
119 #思路:设计一个包含三个元素(字符,权值,索引)的元组列表,同时对权值和索引排序
120 #如果如果是非字母,就不添加进元组,直接输出,非字母就添加进元组后再插入
121 
122 while True:
123     try:
124         new_string = ''
125         string = input()
126         d = []
127         for i in range(len(string)):
128             if string[i].isalpha():
129                 d.append((string[i],i,ord(string[i].lower())))
130         d.sort(key=lambda x:(x[2],x[1]))
131         flag =0
132         for i in range(len(string)):
133             if string[i].isalpha():
134                 new_string +=d[flag][0]
135                 flag +=1
136             else:
137                 new_string += string[i]
138         print(new_string)
139     except:
140         break
141 
142 ##################################################
143 """
144 将a-z逐个标记分数0-25, 用space_lis记录非字母的位置,lis收录所有字母,
145 在收录过程中由lis的最后一个元素开始一直比较到第一个元素逐个比较这些元素和所收录字母的得分大小, 
146 最后找到比想收录字母得分小或者等于的元素,在那个元素后面插入想收录字母.
147  当日想收录字母得分比lis中所有元素小的可能性也应该考虑. 这样保证了所收录字母part按照a-z顺序也让字母大小遵循原sentence.
148   最后不要忘记将space_lis中的非字母按照记录的位置加到lis中,
149   最开始本来用dictionary来记录非字母位置后来发现直接用元组逐个记录要更简单,
150   而且dictionary会打乱非字母的记录顺序,这样在还原非字母位置会很麻烦.
151 """
152 
153 l1=string.ascii_lowercase
154 l2=[x for x in range(26)]
155 l=dict(zip(l1,l2))
156 while True:
157     try:
158         sen=input()
159         #string=string.split()
160         lis=[]
161         space_lis=[]
162         for i, part in enumerate(sen):
163             if not part.isalpha():
164                 space_lis.append((part,i))
165             else:
166                 if lis==[]:
167                     lis.append(part)
168                 else:
169                     for j in range(1,len(lis)+1):
170                         if l[part.lower()]>=l[lis[-j].lower()]:
171                             if j==1:
172                                 lis.append(part)
173                                 break
174                             else:
175                                 lis.insert(-j+1, part)
176                                 break
177                         else:
178                             if j==len(lis):
179                                 lis.insert(0,part)
180                                 break
181         for n in space_lis:
182             lis.insert(n[1], n[0])
183         lis=''.join(lis)
184         print(lis)
185     except:
186         break
187 
188 
189 ###############################################################
190 while True:
191     try:
192         strs = input()
193         NewStr = ""  # 先统计所有的大小写字母
194         for x in strs:
195             if x.isalpha():
196                 NewStr += x
197         NewList = sorted(NewStr, key=str.lower)  # 字母按A/a-Z/z排序,并放到列表里面
198 
199         NewWord = ""  # 要打印的新字符串
200         idex = 0  # 用来匹配原字母列表NewList的下标
201         for i in range(len(strs)):  # 遍历原字符串,把字母的按NewList进行替换,非字母的不懂
202             if strs[i].isalpha():  # 大小写字母,替换成以排序的字符串
203                 NewWord += NewList[idex]
204                 idex += 1
205             else:  # 非字母(特殊字符、空格、数字等),还是用原字符串的字符
206                 NewWord += strs[i]
207         print(NewWord)
208     except:
209         break
参考答案

 

 1 import re
 2 
 3 s = input()
 4 # A Famous Saying: Much Ado About Nothing (2012/8).
 5 print(s)
 6 
 7 ss=[]
 8 for i in s:
 9     if i.isalpha() == True:
10         ss+=i.upper()
11 print(ss)
12 ss=sorted(set(ss))
13 print(ss)
14 s_new=[]
15 for i in ss:
16     s_new+=re.findall(i,s,flags=re.I)  #列表的运算
17 print(s_new)
18 
19 for j in range(len(s)):
20     if s[j].isalpha() == False:
21         s_new.insert(j,s[j])
22 
23 print(s_new)
24 print(''.join(s_new))
ME

 

 

 

 

 

 1 while True:
 2     try:
 3         s = input().split()
 4         k = int(s[len(s) - 1])
 5         x = s[len(s) - 2]
 6         ss = list(set(s[1:len(s) - 2]))
 7         L_new = []
 8 
 9         for i in ss:
10             if len(i) == len(x) and i != x and sorted(i) == sorted(x):
11                 L_new.append(i)
12         print(len(L_new))
13         print(sorted(L_new)[k - 1])
14     except:
15         break
16 
17 ==============================================
18 
19 while True:
20     try:
21         s = input().split()
22         k = int(s[len(s) - 1])
23         x = s[len(s) - 2]
24         ss = list(set(s[1:len(s) - 2]))
25         L_new = []
26 
27         for i in ss:
28             if len(i) == len(x) and i != x and ''.join(sorted(i)) == ''.join(sorted(x)):
29                 L_new.append(i)
30         print(len(L_new))
31         print(sorted(L_new)[k - 1])
32     except:
33         break
34 
35 
36 ###########################################################
37 s = input().split()
38 print(s)
39 
40 # 6 cab ad abcd cba abc bca abc 1
41 # s= ['6', 'cab', 'ad', 'abcd', 'cba', 'abc', 'bca', 'abc', '1']
42 n = s[0]
43 # print(n)
44 k = int(s[len(s) - 1])
45 # print(k)
46 ss = list(set(s[1:len(s) - 2]))
47 print(ss)
48 
49 x = s[len(s) - 2]
50 print(x)
51 
52 L_new = []
53 
54 for i in ss:
55     if len(i) == len(x) and i != x and ''.join(sorted(i)) == ''.join(sorted(x)):
56         L_new.append(i)
57 
58 print(len(L_new))
59 print(sorted(L_new))
60 print(sorted(L_new)[k - 1])
61 
62 #################################################################
63 while True:
64     try:
65         #读取输入数据,并且转换为列表
66         data1 = input().split()
67         #获取单词的个数
68         n1 = data1[0]
69         #按字典排序的第几个兄弟词
70         n2 = data1[-1]
71         #获取输入的n个单词
72         data2 = data1[1:-2]
73         #获取兄弟词
74         data3 = data1[-2]
75 
76         #用于存储兄弟词的数量
77         n3 = 0
78         #用于存储兄弟词
79         data4 = []
80 
81         for word in data2:
82             if word == data3:
83                 continue
84             elif sorted(word) == sorted(data3):
85                 n3 = n3 + 1
86                 data4.append(word)
87         print(n3)
88         #将兄弟词按照字典排序
89         data5 = sorted(data4)
90         print(data5[int(n2)-1])
91     except:
92         break
参考答案

 

posted on 2022-04-19 22:14  pf42280  阅读(250)  评论(0)    收藏  举报