4.23 update: 省一咯
Powered by:NEFU AB-IN
博主個人的暴力題解,基本很少是正解,求輕噴
Python大學(xué)A組 個人暴力題解
-
試題 A: 特殊日期
-
題意
-
思路
模擬即可,本身想用Python自帶的datetime庫,結(jié)果發(fā)現(xiàn)年不能開那么大,就直接手寫了
-
代碼
''' Author: NEFU AB-IN Date: 2023-04-08 14:15:52 FilePath: \Vscode\ACM\LanQiao\2023PythonA\a.py LastEditTime: 2023-04-08 14:19:47 ''' # AB-IN AK Lanqiao !! # http://222.27.161.91/home.page # aR7H4tDF import sys, math from collections import Counter, deque, defaultdict from bisect import bisect_left, bisect_right from heapq import heappop, heappush, heapify from typing import * from datetime import datetime, timedelta N = int(1e6 + 10) INF = int(2e9) sys.setrecursionlimit(INF) read = lambda: map(int, input().split()) class sa: def __init__(self, y, m, d): self.y = y self.m = m self.d = d def __lt__(self, x): pass # ---------------divrsion line ---------------- # t1 = datetime(2000, 1, 1) # t2 = datetime(2000, 1, 2) # ans = 0 # while True: # if t1.year % t1.month == 0 and t1.year % t1.day == 0: # ans += 1 # t1 = t1 + timedelta(days=1) # if t1 == t2: # break # print(ans) mouths = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] def func(t1): y, m, d = t1.y, t1.m, t1.d if (y % 4 == 0 and y % 100) or (y % 400 == 0): mouths[2] = 29 else: mouths[2] = 28 d += 1 if d > mouths[m]: d = 1 m += 1 if m > 12: m = 1 y += 1 return sa(y, m, d) t1 = sa(2000, 1, 1) t2 = sa(2000000, 1, 2) ans = 0 while True: if t1.y % t1.m == 0 and t1.y % t1.d == 0: ans += 1 t1 = func(t1) if t1.y == t2.y and t1.m == t2.m and t1.d == t2.d: break print(ans) # 35813063
-
-
試題 B: 分糖果
-
題意
-
思路
DFS爆搜即可
-
代碼
# AB-IN AK Lanqiao !! import sys, math from collections import Counter, deque, defaultdict from bisect import bisect_left, bisect_right from heapq import heappop, heappush, heapify from typing import * from datetime import datetime, timedelta N = int(1e6 + 10) INF = int(2e9) sys.setrecursionlimit(INF) read = lambda : map(int, input().split()) class sa: def __init__(self, x, y): self.x = x self.y = y def __lt__(self, x): pass # ---------------divrsion line ---------------- # 兩種糖果分別有 9 個和 16 個,要全部分給 7 個小朋友,每個小朋友得到 # 的糖果總數(shù)最少為 2 個最多為 5 個,問有多少種不同的分法。 ans = 0 def dfs(sum1, sum2, cnt): global ans if sum1 < 0 or sum2 < 0: return if cnt == 8: if sum1 == 0 and sum2 == 0: ans += 1 return for i in range(2, 6): dfs(sum1 - i, sum2, cnt + 1) for i in range(2, 6): dfs(sum1, sum2 - i, cnt + 1) for i in range(2, 6): for j in range(2, 6): if i + j >= 2 and i + j <= 5: dfs(sum1 - i, sum2 - j, cnt + 1) dfs(9, 16, 1) print(ans) # 148540
-
-
試題 C: 三國游戲
-
題意
-
思路
直接沒思路,一看到數(shù)據(jù)范圍瞬間慫了,腦子里想的只有暴力,這個題是留到最后寫的,就寫了個最差的二進(jìn)制枚舉
-
代碼
# AB-IN AK Lanqiao !! import sys, math from collections import Counter, deque, defaultdict from bisect import bisect_left, bisect_right from heapq import heappop, heappush, heapify from typing import * from datetime import datetime, timedelta N = int(1e6 + 10) INF = int(2e9) sys.setrecursionlimit(INF) read = lambda : map(int, input().split()) class sa: def __init__(self, x, y): self.x = x self.y = y def __lt__(self, x): pass # ---------------divrsion line ---------------- # 最差方法 二進(jìn)制枚舉 n, = read() a = list(read()) b = list(read()) c = list(read()) ans = 0 for i in range(1 << n): A, B, C, cnt = 0, 0, 0, 0 for j in range(n): if i & 1 << j: A += a[j] B += b[j] C += c[j] cnt += 1 if A > B + C or B > A + C or C > A + B: ans = max(ans, cnt) print(ans if ans != 0 else -1)
-
-
試題 D: 平均
-
題意
-
思路
唯一一個覺得暴力是正解的題
就是每個數(shù)最多就是n//10
個,所以就去掉多的數(shù),然后是那些數(shù)中代價小的,最后采用了前綴和優(yōu)化了一下 -
代碼
# AB-IN AK Lanqiao !! import sys, math from collections import Counter, deque, defaultdict from bisect import bisect_left, bisect_right from heapq import heappop, heappush, heapify from typing import * from datetime import datetime, timedelta N = int(1e6 + 10) INF = int(2e9) sys.setrecursionlimit(INF) read = lambda : map(int, input().split()) class sa: def __init__(self, a, b): self.a = a self.b = b def __lt__(self, t): if self.a != t.a: return self.a < t.a return self.b < t.b # ---------------divrsion line ---------------- n, = read() lst = [[] for _ in range(10)] for i in range(n): a, b = read() lst[a].append(b) for i in range(10): lst[i].sort() lst[i] = [0, *lst[i]] # 前綴和 for j in range(1, len(lst[i])): lst[i][j] += lst[i][j - 1] # 保留的個數(shù) k = n // 10 ans = 0 for i in range(10): l = len(lst[i]) - 1 if l > k: ans += (lst[i][l - k]) print(ans)
-
-
試題 E: 翻轉(zhuǎn)
-
題意
-
思路
BFS暴力,不會剪枝,剪枝想了一種,但是沒有證明正確性,所以就沒有采用
-
代碼
# AB-IN AK Lanqiao !! import sys, math from collections import Counter, deque, defaultdict from bisect import bisect_left, bisect_right from heapq import heappop, heappush, heapify from typing import * from datetime import datetime, timedelta N = int(1e6 + 10) INF = int(2e9) sys.setrecursionlimit(INF) read = lambda : map(int, input().split()) class sa: def __init__(self, s, step): self.s = s self.step = step def __lt__(self, x): pass # ---------------divrsion line ---------------- # BFS暴力 不會剪枝 沒證明剪枝一定正確 def solve(): t = input() s = input() t = " " + t s = " " + s if t[1] != s[1] or t[-1] != s[-1]: return -1 q = deque() q.appendleft(sa(s, 0)) while len(q): tp = q.pop() s, step = tp.s, tp.step if s == t: return step for i in range(2, len(s) - 1): if s[i] == '0' and s[i - 1] == '1' and s[i + 1] == '1': g = s[:i - 1] + "111" + s[i + 2:] if g == t: return step + 1 q.appendleft(sa(g, step + 1)) if s[i] == '1' and s[i - 1] == '0' and s[i + 1] == '0': g = s[:i - 1] + "000" + s[i + 2:] if g == t: return step + 1 q.appendleft(sa(g, step + 1)) return -1 T, = read() for _ in range(T): print(solve())
-
-
試題 F: 子矩陣
-
題意
-
思路
這版是直接暴力做的
考試最后寫了一點線段樹優(yōu)化,只不過只維護(hù)了行和列的最小值和最大值,但感覺Python寫的線段樹也優(yōu)化不了多少 -
代碼
# AB-IN AK Lanqiao !! import sys, math from collections import Counter, deque, defaultdict from bisect import bisect_left, bisect_right from heapq import heappop, heappush, heapify from typing import * from datetime import datetime, timedelta N = int(1e3 + 10) MOD = 998244353 INF = int(2e9) sys.setrecursionlimit(INF) read = lambda : map(int, input().split()) class sa: def __init__(self, x, y): self.x = x self.y = y def __lt__(self, x): pass # ---------------divrsion line ---------------- # RMQ 問題 可寫ST表 但我忘了... # 暴力! g = [[0] * N for _ in range(N)] n, m, a, b = read() def func(t1, t2): mn, mx = INF, 0 for i in range(t1.x, t2.x + 1): for j in range(t1.y, t2.y + 1): mn = min(mn, g[i][j]) mx = max(mx, g[i][j]) return mx * mn % MOD for i in range(1, n + 1): g[i][1:] = read() ans = 0 for i in range(1, n + 1): for j in range(1, m + 1): t1 = sa(i, j) t2 = sa(i + a - 1, j + b - 1) if i + a - 1 > n or j + b - 1 > m: continue ans = (ans + func(t1, t2)) % MOD print(ans)
-
-
試題 G: 階乘的和
-
題意
-
思路
還是暴力,思路就是可以把共因子都提出來,剩下的加和,從提出來的共同的因子的最大值開始,讓加和除以它,直到不能除了,就是答案
其中,用哈希表記錄用過的階乘值,預(yù)處理一些階乘值 -
代碼
# AB-IN AK Lanqiao !! import sys, math from collections import Counter, deque, defaultdict from bisect import bisect_left, bisect_right from heapq import heappop, heappush, heapify from typing import * from datetime import datetime, timedelta N = int(1e5 + 10) INF = int(2e9) sys.setrecursionlimit(INF) read = lambda : map(int, input().split()) class sa: def __init__(self, x, y): self.x = x self.y = y def __lt__(self, x): pass # ---------------divrsion line ---------------- # 暴力! # 預(yù)處理1 ~ 5000階乘 dd = Counter() cnt = 1 for i in range(1, 5000): cnt *= i dd[i] = cnt # --------------------------------------------- a = [0] * N n, = read() a[1:] = list(read()) d = Counter() base = min(a[1:]) ans = 0 for i in range(1, n + 1): tmp = 1 if a[i] < 5000: d[a[i]] = dd[a[i]] // dd[base] elif d[a[i]] == 0: for j in range(a[i], base, -1): tmp *= j d[a[i]] = tmp ans += d[a[i]] while True: if ans == 1 or ans % (base + 1) != 0: break base += 1 ans //= base print(base)
-
-
試題 H: 奇怪的數(shù)
-
題意
-
思路
還是暴力DFS
相當(dāng)于搜滿足條件的n位數(shù),直接搜每一位即可,因為奇數(shù)位為奇數(shù),偶數(shù)位為偶數(shù)
優(yōu)化就是每次搜每一位的時候,和前面的四位數(shù)加和,判斷是否小于等于m,如果不滿足就直接不搜了 -
代碼
# AB-IN AK Lanqiao !! import sys, math from collections import Counter, deque, defaultdict from bisect import bisect_left, bisect_right from heapq import heappop, heappush, heapify from typing import * from datetime import datetime, timedelta N = int(1e6 + 10) INF = int(2e9) MOD = 998244353 sys.setrecursionlimit(INF) read = lambda : map(int, input().split()) class sa: def __init__(self, x, y): self.x = x self.y = y def __lt__(self, x): pass # ---------------divrsion line ---------------- # 感覺像數(shù)位dp,先打DFS暴力 # 想不出遞推式 就優(yōu)化暴力吧 n, m = read() ji = ["1", "3", "5", "7", "9"] ou = ["0", "2", "4", "6", "8"] stji, stou = [0] * 5, [0] * 5 ans = 0 def dfs(s, d): global ans if d == n + 1: ans = (ans + 1) % MOD return for i in range(5): if d % 2 == 1: cnt = int(ji[i]) for j in range(max(1, d - 4), d): cnt += int(s[j]) if cnt <= m: dfs(s + ji[i], d + 1) if d % 2 == 0: cnt = int(ou[i]) for j in range(max(1, d - 4), d): cnt += int(s[j]) if cnt <= m: dfs(s + ou[i], d + 1) return dfs(" ", 1) print(ans % MOD)
-
-
試題 I: 子樹的大小
-
題意
-
思路
沒時間想了,感覺暴力都很麻煩
-
代碼
-
-
試題 J: 反異或 01 串
-
題意
文章來源:http://www.zghlxwxcb.cn/news/detail-408456.html
-
思路
沒時間想了,就特判了幾種情況文章來源地址http://www.zghlxwxcb.cn/news/detail-408456.html
-
代碼
# AB-IN AK Lanqiao !! import sys, math from collections import Counter, deque, defaultdict from bisect import bisect_left, bisect_right from heapq import heappop, heappush, heapify from typing import * from datetime import datetime, timedelta N = int(1e6 + 10) INF = int(2e9) sys.setrecursionlimit(INF) read = lambda : map(int, input().split()) class sa: def __init__(self, x, y): self.x = x self.y = y def __lt__(self, x): pass # ---------------divrsion line ---------------- # 騙分 def solve(s): d = Counter(s) if len(s) == d['0']: return 0 if len(s) == d['1']: return len(s) // 2 if s == "00111011": return 3 return d['1'] s = input() print(solve(s))
-
到了這里,關(guān)于第十四屆藍(lán)橋杯大賽軟件組省賽 Python大學(xué)A組 個人暴力題解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!