文章目录
宜居星球改造计划
- yes no na 每个值为一个格子;
- 每天yes的值可以向上下左右扩展一个格子,将no改为yes;
- 矩形区域no是否可以全部转为yes,可以的话需要几天?不可以的话输出-1
- 输入:
yes yes no
no no no
yes no no
思路: - xxx
python:
data = []
while True:
s = input().strip().split()
if s:
data.append(s)
else:
break
# 四个方向
direct = [(-1, 0), (1, 0), (0, 1), (0, -1), (0, 0)]
total_days = 0
# 改造
result = start_improve(data)
找最小数
pass
查字典
- 输入一个单词前缀、字典长度、字典数组;
- 字典数组已经排序;
- 输出包含该单词前缀的所有单词;每个单词占一行;
示例
输入:
abc 3 a ab abc abcd
输出:
abc
abcd
思路:
- 二分查找
python:
def find_str(prefix, n, dict_arr):
global flag
if n == 0:
return
if n == 1:
if dict_arr[0].startswith(prefix):
flag = True
print(dict_arr[0])
return
mid = n // 2 # 二分
left_arr = dict_arr[:mid]
right_arr = dict_arr[mid:]
find_str(prefix, len(left_arr), left_arr)
find_str(prefix, len(right_arr), right_arr)
if __name__ == '__main__':
s = input().strip().split()
prefix = s[0]
n = int(s[1])
dict_arr = s[2:]
flag = False # 表示未找到
# 未找到则不会输出
find_str(prefix, n, dict_arr)
# 一直未找到 flag保持为False
if not flag:
print(-1)
两个整数数组中同时出现的整数
- 有同时出现的整数,按照同时出现次数(取两次数的最小值)归类;
- 按照次数,从小到大按行输出;
- 两数组没有同时出现的整数时,输出NULL;
输入:
第一行,一个整数数组;
第二行,一个整数数组;
输出:
同时出现次数从小到大按行输出,格式为 次数:该次数下的整数(升序排序)
示例1
输入:
5,3,6,-8,0,11
2,8,8,8,-1,15
输出:
NULL
示例2
输入:
5,8,11,3,6,8,8,-1,11,2,11,11
11,2,11,8,6,8,8,-1,8,15,3,-9,11
输出:
1:-1,2,3,6
3:8,11
思路
- 交集求同时出现的整数;
- 统计每个同时出现的整数,在两个数组中同时出现的最少次数;
- 字典存储,次数为key,出现对应次数的整数列表为val
python:
if __name__ == '__main__':
arr1 = list(map(int, input().strip().split(",")))
arr2 = list(map(int, input().strip().split(",")))
arr1_set = set(arr1)
arr2_set = set(arr2)
common_set = arr1_set & arr2_set
if not common_set:
print("NULL")
else:
# 有共同整数
statistic_times = {
}
for i in common_set:
t1 = arr1.count(i)
t2 = arr2.count(i)
t = min(t1, t2)
if t in statistic_times:
statistic_times[t].append(i)
else:
statistic_times[t] = [i]
result = sorted(statistic_times.items(), key=lambda i:i[0])
for tu in result:
int_list = tu[1]
int_list.sort()
int_list_str = map(str, int_list)
print(f"{
tu[0]}:", ",".join(int_list_str))
分积木
- 有一堆积木,每个积木都有自己的重量;
- A、B两人想分配两堆且重量相等;
- A 计算求和时,将数值转为二进制,求和时不进位,如25(11001)+11(01011)= 18(10010)
- B满足A的要求下(二进制计算且不进位时,两堆重量相等),如何让自己获取的重量最大。(B按正常数值计算且正常进位)
示例1
输入:
3
3 5 6
输出:
11
示例2
输入:
5
4 5 3 2 8
输出:
-1
思路:
- 所有值进行异或,结果为0才可以平分;
- 将重量数组按照顺序进行二分;
- A 进行(整数值)异或计算,两边相等时,B可以取两堆中的最大重量的积木;
python:
def calc_as_a(arr):
if len(arr) == 1:
return arr[0]
result = arr[0]
for i in range(1, len(arr)):
result ^= arr[i]
return result
if __name__ == '__main__':
# 积木数量
m = int(input().strip())
weights_arr = list(map(int, input().strip().split()))
result = -1
for i in range(1, m):
left = weights_arr[:i]
right = weights_arr[i:]
# 满足A的条件
if calc_as_a(left) == calc_as_a(right):
result = max(result, sum(left), sum(right))
# 满足A的情况下,B获取的最大重量
print(result)