寫(xiě)在前面 :
KS感覺(jué)這次比賽....Emmm一言難盡,貼吧充斥著車(chē)隊(duì),B站傳著退費(fèi)視頻...
Whatever , 既然報(bào)了名并且用心準(zhǔn)備了,那就全力以赴??
本次考試特點(diǎn) :模擬模擬模擬!從頭模到尾!
學(xué)了那么久的暴力算法居然只能被冷藏...
———————————————————————————————————————————
* 這次的戰(zhàn)果是1道填空 + 7道大題 本篇博客中大題的代碼都通過(guò)了樣例 并不能保證AC
* 如果我任何表達(dá)不清或者有任何不理解之處 可以留言交流 我會(huì)在看到的第一時(shí)間做出回答!
* 如有錯(cuò)誤 歡迎指出!
Start :
?
?
?
第一題 : 沒(méi)啥好說(shuō)的了.. 簽到題實(shí)錘 注意不要想去怎樣寫(xiě)代碼 這題純純的手算題 初中數(shù)學(xué)
答案 : 443
?
?這道題KS并沒(méi)有寫(xiě)出來(lái) 除了暴力求解 我也確實(shí)沒(méi)想到什么好的算法(我是fw
微信群有一哥們直接寫(xiě)了考試日期 :2022040920220409 據(jù)說(shuō)是正確答案 ??
?
?思路:先用素?cái)?shù)篩篩出小于n的所有素?cái)?shù) 再判斷是否能被n整除
n = int(input())
Flag = [True for i in range(n+1)]
for i in range(2,int(n**(0.5))+1) : # 素?cái)?shù)篩
if Flag[i] :
tmp = i+i
while tmp < n+1 :
Flag[tmp] = False
tmp += i
Sum = 0
for i in range(2,n+1) : # 判斷因數(shù)
if n % i == 0 and Flag[i] :
Sum += 1
print(Sum)
?
我著實(shí)沒(méi)想到第二個(gè)大題就讓我無(wú)從下手...
如果有哪位大佬寫(xiě)出來(lái)了或者有思路 歡迎私信我或者在留言區(qū)教一下KS...
?
?這道題目還是有點(diǎn)意思 一眼看上去很難 但其實(shí)只要我們對(duì)兩個(gè)樣例模擬一下操作過(guò)程 很容易想到解決辦法 (實(shí)在不行直接打印EMPTY估計(jì)也能騙幾個(gè)測(cè)試點(diǎn)
思路:用一個(gè)while循環(huán) 出循環(huán)的條件是:要么字符串為空 要么這輪循環(huán)得到的字符串與上一輪循環(huán)得到的字符串相同 即后續(xù)的操作已經(jīng)不能再影響字符串了 所以2^64就是嚇人用的..
Convert函數(shù):用于轉(zhuǎn)換字符串 模擬裁切邊緣字符的過(guò)程 我們判斷每?jī)蓚€(gè)相鄰的字符 若滿足邊緣字符的定義則取出他們的index放入備用集合中 最后返回對(duì)應(yīng)索引不在集合里的字符組成的新字符串
s = input()
def convert(string) :
res = []
tmp = set()
string = list(string)
for i in range(len(string)) :
if i == 0 or i == len(string)-1 :
continue
else :
if string[i] == string[i-1] and string[i] != string[i+1] :
tmp.add(i)
tmp.add(i+1)
if string[i] != string[i-1] and string[i] == string[i+1] :
tmp.add(i-1)
tmp.add(i)
for i in range(len(string)) :
if i not in tmp :
res.append(string[i])
res = "".join(res)
return res
while 1 :
new_string = convert(s)
if s == new_string :
print(s)
break
if new_string == '' :
print('EMPTY')
break
s = new_string
?
思路 : 這道題思路還是很好想的 無(wú)非就是讓重合次數(shù)最多的區(qū)間的值盡可能的大 所以我們只需要算出每一個(gè)點(diǎn)被幾個(gè)區(qū)間所包含再排序 將原數(shù)組里的值由大到小賦給被排好序的點(diǎn)即可
import copy
n = int(input())
numList = list(map(int,input().split()))
temp = copy.deepcopy(numList)
temp.insert(0,0)
numList.sort()
m = int(input())
cmd = []
for i in range(m) :
cmd.append(list(map(int,input().split())))
numList.insert(0,0)
count = dict((i,0)for i in range(1,n+1)) # 用字段儲(chǔ)存每個(gè)點(diǎn)的訪問(wèn)次數(shù)
for item in cmd :
for i in range(item[0],item[1]+1) :
count[i] += 1
newCount = []
for i in count.keys() :
newCount.append((i,count[i])) # 將字典轉(zhuǎn)化為元組排序
newCount.sort(key=lambda x:x[1],reverse=True)
ans = [0 for i in range(n+1)]
for i in range(n) :
tmp1,tmp2 = newCount[i]
tmp = numList.pop() # 取出最大的數(shù)
ans[tmp1] = tmp
out = 0
for i in range(m) :
out += (sum(ans[cmd[i][0]:cmd[i][1]+1])-sum(temp[cmd[i][0]:cmd[i][1]+1]))
print(out)
?
這題... KS可以很明確地說(shuō)不可能AC了 考場(chǎng)時(shí)我的思路是看能不能找到每組數(shù)的規(guī)律[1,3]
[1,4],[1,5]... 奈何時(shí)間有限 消磨了不少時(shí)間最后也沒(méi)找到規(guī)律 不知道是不是思路錯(cuò)了 沒(méi)有辦法只能寫(xiě)了個(gè)暴力上去... 能騙幾分算幾分吧...
import itertools
n = int(input())
numList = [i for i in range(1,n+1)]
def check(lst) :
res = []
for i in range(len(lst)) :
tmp = 0
for j in range(i) :
if lst[i] > lst[j] :
tmp += 1
res.append(tmp)
return sum(res)%998244353
ans = 0
for item in itertools.permutations(numList) :
ans = (ans + check(list(item)))%998244353
print(ans)
?
?思路 : 最長(zhǎng)上升子序列模版題了 特判一下是否為全上升的序列 若不是 直接輸出最長(zhǎng)上升子序列+K即可 否則輸出N
def check(lst) :
for i in range(1,len(lst)) :
if lst[i] < lst[i-1] :
return False
return True
N,K = map(int,input().split())
numList = list(map(int,input().split()))
if check(numList) :
print(N)
else :
dp = [1 for i in range(N)]
for i in range(N) :
for j in range(i) :
if numList[i] >= numList[j] :
dp[i] = max(dp[i],dp[j]+1)
ans = dp[-1] + K
print(ans)
?
?
?
?思路:貪心+模擬 while循環(huán) 只要還有相鄰的兩個(gè)數(shù)都不為0 就一起-1 直到不能再減為止 此時(shí)剩下數(shù)的和是幾就加幾
import copy
n,K = map(int,input().split())
numList = list(map(int,input().split()))
count = 0
def check(lst) :
if 0 in lst :
return False
return True
while 1 :
tmp = copy.deepcopy(numList)
for i in range(n-K+1) :
if check(numList[i:i+K]) :
count += 1
for j in range(i,i+K) :
numList[j] -= 1
if tmp == numList :
break
for i in range(n) :
count += numList[i]
print(count)
?
?思路 : 這題考查方向主要還是數(shù)論 具體來(lái)說(shuō) :有這樣幾類(lèi)數(shù)是表示不出來(lái)的 :
1 質(zhì)數(shù)
2 合數(shù) 但該合數(shù)不斷除2或者不斷除3后得到了個(gè)質(zhì)數(shù)
3 不斷除2直到不能除 再不斷除3 若只能除一次3 則不符合
或者不斷除3 再不斷除2 若只能除一次2 則不符合?文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-408645.html
import copy
T = int(input())
cmd = []
for i in range(T) :
cmd.append(int(input()))
maxNum = max(cmd)
flag = [True for i in range(maxNum+1)]
for i in range(2,int(maxNum**(0.5))+1) :
if flag[i] :
tmp = i + i
while tmp <= maxNum :
flag[tmp] = False
tmp += i
flag[0],flag[1] = False,False
def check1(num) :
tmp1 = copy.deepcopy(num)
while tmp1%3 == 0 :
tmp1 //= 3
count = 0
while tmp1%2 == 0 :
tmp1 //= 2
count += 1
if count == 1 :
return False
tmp2 = copy.deepcopy(num)
count = 0
while tmp2%2 == 0 :
tmp2 //= 2
while tmp2%3 == 0 :
tmp2 //= 3
count += 1
if count == 1 :
return False
return True
def check2(num) :
if flag[num] == False :
return True
return False
def check3(num) :
tmp1 = copy.deepcopy(num)
tmp2 = copy.deepcopy(num)
while tmp1 % 2 == 0 :
tmp1 //= 2
if flag[tmp1] == True and tmp1 != 3:
return False
while tmp2 % 3 == 0 :
tmp2 //= 3
if flag[tmp2] == True and tmp2 != 2:
return False
return True
for item in cmd :
if check2(item) :
if check3(item) :
if check1(item) :
print('yes')
else :
print('no')
else :
print('no')
else :
print('no')
————————————————————————————
寫(xiě)在最后 : 一年一次藍(lán)橋杯省賽就這樣結(jié)束了 我相信認(rèn)真準(zhǔn)備的人一定會(huì)有所收獲 如果我運(yùn)氣夠好 我們國(guó)賽再見(jiàn)!??????
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-408645.html
到了這里,關(guān)于第十三屆藍(lán)橋杯大學(xué)A組題解(Python)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!