A

简单的暴力枚举

1
2
3
4
5
6
7
cnt = 0
for r in range(0,256):
for g in range(0,256):
for b in range(0,256):
if b > g and b > r:
cnt += 1
print(cnt)

B

当时比赛的时候卡了很久wwww,看了题解也不会。。。

C

模运算的使用,但是也可以无脑拓宽长度,这样就不用取模了

1
2
3
4
h,w = map(int,input().split())
a = '2025'*9999
for i in range(h):
print(a[i:i+w])

D

比赛的时候以为只是普通的贪心思想,二进制中没有0就放进去,结果WA了。
从这一题中新学到了python的funtools库相关知识。在这一题中主要使用了functools.cmp_to_key(func)函数,该函数可以自定义一个比较函数,改变python中的比较逻辑。至于具体的比较,则是sort()中的Timsort来控制的。使用这个函数可以实现比较复杂的比较逻辑。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import functools

def get_max_binary_number(n):
nums = list(range(1, n + 1))
def compare(a, b):
# 去掉前缀"0b"
a_bin = bin(a)[2:]
b_bin = bin(b)[2:]
# 比较两种拼接方式
ab = a_bin + b_bin
ba = b_bin + a_bin
# 如果ba更大,那么b应该排在a前面
if ba > ab:
return 1
else:
return -1

nums.sort(key=functools.cmp_to_key(compare))
binary_str = ""
for num in nums:
binary_str += bin(num)[2:]

# 转换为十进制
return int(binary_str, 2)

n = int(input())
print(get_max_binary_number(n))

比如在这一题中,比较的逻辑是拼接后较大的放在前面,那么我们只需要定义一个compare()函数,默认的次序是根据填入的参数的顺序,比如这里是a,b。最后返回1则是需要更换位置,-1为不需要交换位置。再把这个自定义函数传给cmp_to_key就好了
更多库的使用可以参考竞赛中常用的Python 标准库

E

最理想的情况就是分成平均值了,但是单单按照这个考虑有些测试点过不去

1
2
3
4
5
6
7
8
9
10
11
12
n, k = map(int, input().split())
a = list(map(int, input().split()))
groups = [[] for _ in range(k)]
for i in range(n):
groups[i % k].append(a[i])
min_value = float('inf')
for group in groups:
total_water = sum(group)
bottle_count = len(group)
avg = total_water // bottle_count
min_value = min(min_value, avg)
print(min_value)

但实际上,这道题是比较标准的二分查找。对于求最小值最大化和最大值最小化的问题,都可以使用二分查找来解决。对于本题,具体步骤是:

  1. 先枚举,即取mid
  2. 检查是否符合,若符合,则向右寻找,因为需要的是最大的符合值
  3. 不符合,则向左寻找,因为本题是判断是否可以通过倒水操作,使每个瓶子组内所有瓶子的水量都大于等于 target,不符合则说明取太大了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
def check(target,groups):
for group in groups:
water = 0
for i in group:
water += i - target
if water < 0:
return False
return True

n, k = map(int, input().split())
a = list(map(int, input().split()))
groups = [[] for _ in range(k)]
for i in range(n):
groups[i % k].append(a[i])

l,r = 0,max(a)
res = 0

while l <= r:
mid = (l + r) // 2
if check(mid,groups):
res = mid
l = mid + 1
else:
r = mid - 1

print(res)

F

就是一个个情况考虑下去

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
def cnt(x):
return str(x).count('6')

n = int(input())
arr = list(map(int, input().split()))
ans = 0
hash = [0] * 6
for num in arr:
if cnt(num) >= 6:
ans += 1
else:
hash[cnt(num)] += 1

t = min(hash[5],hash[1])
ans += t
hash[5] -= t
hash[1] -= t
#没拼上的当4考虑
hash[4] += hash[5]
hash[5] = 0
t = min(hash[4],hash[1]//2)
ans += t
hash[4] -= t
hash[1] -= t * 2
t = min(hash[4],hash[2])
ans += t
hash[4] -= t
hash[2] -= t
hash[3] += hash[4]
hash[4] = 0
t = min(hash[3],hash[2],hash[1])
ans += t
hash[3] -= t
hash[2] -= t
hash[1] -= t
t = hash[3] // 2
ans += t
hash[3] -= t * 2
hash[2] += hash[3]
hash[3] = 0
t = hash[2] // 3
ans += t
hash[2] -= t * 3

print(ans)

G