第四题 其实是先看的第五题,回来看了半天没思路,想了想肯定会有方案数为0的情况,结果能过45%... n, k = map(int, input().split()) a = [0] + list(map(int, input().split())) 1. dp[i][j] 表示枚举到数组前i位,删了j个数的方案数 2. 正难则反,用总方案数C(n, k)减去删除后不为倍数的方案, 算贡献 dp = [[0] * (k + 1) for _ in range(n + 1)] MOD = 10 ** 9 + 7 now = 0 for i in range(n): ok = 0 for j in range(n): if i == j: continue else: temp = math.gcd(a[i], a[j]) if temp == a[i] or temp == a[j]: ok = 1 break if ok: if now < k: dp[i][now + 1] *= dp[i - 1] else: if now < k: dp[i][now + 1] = 0 print(dp[n][k]) 注释是赛时的思路,但都没推出来,整份代码其实就是变着花样的print(0) 第五题 看着很有思路,一通乱敲,过样例了!好!提交!0%!遂怒,猜了个n/2看看能过多少,结果全过了,你这数据比上午的东子都水啊。。。 # 好像代码没存,总之硬模拟了一下 print(n // 2)
第三题 签中签,虽然除法肯定更优,但只需要枚举a[0]乘2的次数即可,也没啥好说的 n = int(input()) a = list(map(int, input().split())) ans = 1 << 31 temp = a[0] for j in range(33): t = j res = a[0] * (2 ** j) for i in range(1, n): temp2 = a[i] while temp2 > res: temp2 //= 2 t += 1 ans = min(ans, t) print(ans)
最水的一集,20min写完了四道半,盯第四题盯了40min没思路在1h的时候就直接交了 第一题 签到中的签到,没什么好说的 n = int(input()) a = list(map(int, input().split())) ok = 1 b = [] for i in range(n - 1): b.append(a[i + 1] - a[i]) for i in range(n - 1): if a[i + 1] <= a[i]: ok = 0 break for i in range(n - 2): if b[i + 1] >= b[i]: ok = 0 break print("Yes" if ok else "No") 第二题 签中签 n, m = map(int, input().split()) s = "meituan" now = 0 a = [] for i in range(n): a.append(input()) for i in range(n): if s[now] in a[i]: now += 1 if now == 7: break print("YES" if now == 7 else "NO")