[acwing周赛复盘] 第 120 场周赛20230909
- 总结
- 5146. 最大GCD
- 1. 题目描述
- 2. 思路分析
- 3. 代码实现
- 5147. 数量
- 1. 题目描述
- 2. 思路分析
- 3. 代码实现
- 5148. 字符串匹配
- 1. 题目描述
- 2. 思路分析
- 3. 代码实现
- 六、参考链接
总结
- T1好难啊。
- T1 数学
- T2 dfs/数位dp
- T3 计数贪心
5146. 最大GCD
链接: 5146. 最大GCD
1. 题目描述
2. 思路分析
- 由于a<b,因此两数不同。它们还要公因子最大,那么最优是差个2。
- 因此a,b分别是最大的偶数和它//2。
3. 代码实现
def solve():
n, = RI()
print(n//2)
5147. 数量
链接: 5147. 数量
1. 题目描述
2. 思路分析
- 由于每位只有2选择,且只有9位,那么可以直接dfs暴力枚举每一位上的数字。
- 也可以数位dp
3. 代码实现
# ms
def solve():
n, = RI()
s = str(n)
@lru_cache(None)
def f(i,is_limit,is_num):
if i == len(s):
return int(is_num)
up = int(s[i]) if is_limit else 9
down = 0 if is_num else 1
ans = 0
if not is_num:
ans += f(i+1,False ,False)
for j in [4,7]:
if down <= j <= up:
ans += f(i+1,is_limit and j == up, True)
return ans
print(f(0,True,False))
5148. 字符串匹配
链接: 5148. 字符串匹配
1. 题目描述
2. 思路分析
- 计数贪心。由于t的位置是随便调整的,因此优先保留能和s完全匹配的字符;然后保留普通匹配的字符。
- 对s中每个字符优先匹配相同的,然后匹配大小写不同的。
3. 代码实现
def solve():
s, = RS()
t, = RS()
a,b = Counter(s),Counter(t)
x = y = 0
for c in string.ascii_letters:
p = min(a[c],b[c])
x += p
a[c] -= p
b[c] -= p
for c in string.ascii_lowercase:
y += min(a[c],b[c.upper()])
for c in string.ascii_uppercase:
y += min(a[c],b[c.lower()])
print(x,y)
六、参考链接
- 无