2020全国高校计算机能力挑战赛程序设计赛Python组区域赛(初赛)试题及参考解答
2020全國高校計算機能力挑戰賽程序設計賽Python組區域賽(初賽)試題及參考解答
- 簡介
- 賽題構成
- 代碼提交說明
- 成績評定
- 2020真題
- 1-1 數字與相鄰的前、后數字之和可以被4整除
- 題目
- 個人對題目的理解
- 官方參考代碼
- 2-1 連續M個數之積最小
- 題目
- 個人對題目的理解
- 官方參考代碼
- 變形題
- 找到連續M個數之“和最大”
- 官方參考代碼
- 找到連續M個數之“積最大”
- 官方參考代碼
- 3-1 字符串中最長連續非降序子串
- 題目
- 個人對題目的理解
- 官方參考代碼
- 3-2 病毒信息篩選
- 題目
- 個人對題目的理解
- 官方參考代碼
- 3-3 貨物擺放
- 題目
- 個人對題目的理解
- 官方參考代碼
- 4-1 游戲地圖選洼地
- 題目
- 個人對題目的理解
- 官方參考代碼
簡介
程序設計賽分為區域賽(初賽)和決賽。區域賽分為華東、華中、華北、華南、東北、西南、西北七大賽區,根據各區域考生的參賽科目分別排名,分設一等獎、二等獎、三等獎和優秀獎各若干項。
賽題構成
賽題為選擇題* 15(45分)+ 程序設計題* 4(55分),限時90分鐘!
代碼提交說明
成績評定
程序設計賽選擇題采用答案比對電腦閱卷;編程題按照測試點進行評判,并按照測試點給分,每個測試點通過即得到相應的分數,否則該測試點得分為0分,該題的最終得分由代碼通過的測試點得分之和構成。比賽過程中,每道編程題目允許多次提交,系統取該道編程題的最高得分作為該題的最終分數。
更多信息請查看競賽官網:http://www.ncccu.org.cn/case4.html
2020真題
1-1 數字與相鄰的前、后數字之和可以被4整除
題目
輸入樣例2:3 9
輸出樣例2:4 8 -1
個人對題目的理解
此題比較簡單
N, M = map(int,input().split()) lst = []for i in range(N+1,M):a = i+1b = i-1if (a+b+i)%4 == 0:lst.append(i)if len(lst) >= 3:lst = lst[0:3] else:for k in range(0,3-len(lst)): # 少于3個數據的用-1補全lst.append(-1)for j in lst:print(j)已通過系統代碼測試
官方參考代碼
N, M = map(int,input().split()) res = [] for i in range(N+1, M):if len(res) == 3:breakif not 3 * i % 4:res.append(i) while len(res) < 3:res.append(-1) print(res[0], res[1], res[2])2-1 連續M個數之積最小
題目
1 2 3 4 5 6 7 8 9 10
個人對題目的理解
# 我的答案 N=10 M=4 NumList = [3,10,4,1,6,11,8,2,1,50] # 比較N-M+1次就結束了NewLst = [] for i in range(0,N-M+1): # N-M+1=7new_num = NumList[i]*NumList[i+1]*NumList[i+2]*NumList[i+3]NewLst.append(new_num)# print(NewLst)temp = NewLst[0] for j in range(0,len(NewLst)):if NewLst[j] < temp:temp = NewLst[j]else:pass print(temp,NewLst.index(temp)+1)輸出:
不懂為何無法通過系統代碼測試
官方參考代碼
N, M = map(int, input().split()) listNum = list(map(int, input().split())) listSum = [] for i in range(0, N-M):temp = 1for j in range(i, i + M):temp *= listNum[j]listSum.append((temp, i)) listSum.sort() print(listSum[0][0],listSum[0][1]+1)變形題
找到連續M個數之“和最大”
官方參考代碼
N, M = map(int, input().split()) listNum = list(map(int, input().split())) listSum = [] # 也可以使用列表生成式計算,代碼將簡潔許多 for i in range(0, N - M + 1):listSum.append((sum(listNum[i:M + i]), i)) listSum.sort(reverse=True)print(listSum[0][0], listSum[0][1] + 1)找到連續M個數之“積最大”
官方參考代碼
N, M = map(int, input().split()) listNum = list(map(int, input().split())) listRes = [] for i in range(N):if i + M <= N:temp = 1for j in range(i, i + M):temp *= listNum[j]listRes.append((temp, i)) listRes.sort(key=lambda x: x[0], reverse=True) print(listRes[0][0], listRes[0][1]+1)3-1 字符串中最長連續非降序子串
題目
題目描述:輸入一個由’a’-‘z’組成的字符串,找到字符串中出現的最長連續非降序子串,輸出該子串。
輸入說明:一個字符串S(長度<10000)
輸出說明:字符串中最長的連續升序子串
輸入樣例:abcadiasiqacdfgiikkg
輸出樣例:acdfgiikk
數據范圍:S長度<10000
個人對題目的理解
一臉懵逼!
s = input()lst = [] for i in range(len(s)):for j in range(len(s)+1):new_s = s[i:j]lst.append(new_s) Lst = [i for i in lst if i != '']newLst = []for i in Lst:if len(i) == 1:passelif len(i) != 1:j = 0while j != len(i)-1:j += 1if i[j] < i[j-1]:newLst.append(i)S = set(Lst).difference(set(newLst)) L = list(S) res = max(L, key=len, default='') print(res)用很蠢的方法做出來了,但是系統會提示運行內存超過題目要求…
官方參考代碼
str1 = input() L, R, res, resL, resR = 0, 0, 0, 0, 0 while R != len(str1)-1:R += 1if str1[R] < str1[R-1]:if R-L-1 > res:res = R - L - 1resL = LresR = RL = R print(str1[resL:resR])3-2 病毒信息篩選
題目
題目描述:
計算網絡數據包中的可能被注入病毒片段信息,經過長期觀察發現,計算機病毒文件源碼中往往包含“_1234.exe”的字符片段。現在請你開發一個計算程序,輔助信息專家檢測這個病毒嫌疑特征。
輸入說明:一個字符串S
輸出說明:字符串中包含”_1234.exe”字符片段的位置,如果包含多個病毒嫌疑特征片段,輸出數量后,再輸出每個片段的位置。如果沒有檢測到病毒嫌疑片段,就輸出0
輸入樣例:ox123_0212_3323_1234.exe20202020202_1234.exe
輸出樣例:2 15 35
個人對題目的理解
看到后我想到了以前做過的一個小題目:https://blog.csdn.net/weixin_47282404/article/details/121730558 , 然而并沒有啥卵用…
于是乎,使用了“打包”的思想:
count = 0 lst = [] s = "_1234.exe" str = 'ox123_0212_3323_1234.exe20202020202_1234.exe'if s not in str:print(0) else:for i in range(0,len(str)):if s == str[i:i+len(s)]: # 以9個為一組,分別比較count += 1lst.append(i) print(count) for j in lst:print(j)已通過系統代碼測試
官方參考代碼
S = input() result = [] count = 0 if "_1234.exe" not in S:print(0) else:listStr = list(S)for i in range(0, len(listStr)):if i + 9 <= len(listStr):tempStr = listStr[i:i+9]if tempStr == list("_1234.exe"):result.append(i)count += 1if count != 1:print(count,end=' ')for i in result:print(i,end=' ')3-3 貨物擺放
題目
題目描述:
便利店擬上架一批貨物,為了便于顧客找到物品,店長嘗試按照貨物的顏色對這批商品進行擺放,已知這批貨物的名稱和顏色,請你按照顏色的字母順序對這批貨物進行處理,給出貨物擺放的次序。
輸入說明:第一行是一個整數N,表明這批貨物的數量;接下來N行是貨物名稱S和顏色信息T,S和T都是字符串,中間用空格分開。
輸出說明:輸出按顏色字母序排序擺放的貨品次序。如果有2個物品的顏色相同,按照貨品名稱字母排序。
輸入樣例:
RiceRoll Cheese Cake FastNoodle Milk Sandwich
個人對題目的理解
一臉懵逼
官方參考代碼
官方使用了如下方法:https://blog.csdn.net/weixin_44769957/article/details/109479281
Num = eval(input()) listGoods = [] for i in range(Num):tmp = input()listGoods.append((tmp.split()[0], tmp.split()[1])) listGoods.sort(key=lambda x:x[1]) for i in listGoods:print(i[0], end=' ')4-1 游戲地圖選洼地
題目
題目描述:
游戲中的地圖都是用二維數組表達的,每個位置表示一個整數表示高度,現在需要找出地圖中的洼地放置寶物。已知表示地圖中各點的高度,用二維數組存放,請找出其中最低的洼地。二維地圖中洼地的定義是該點上、下、左、右四個方向的高度值都大于該點的高度值(邊界上的點不滿足洼地的定義)。
輸入說明:第一行是整數N(0<N<1001),表示二維數組的行數和列數。接下來是一個N行、N列的二維整數矩陣,每個數字表示地圖上該點處的地面高度Hij(0<Hij<2020)。
輸出說明:用于藏寶的最低洼地的位置坐標i、j(1<=i,j<=N),其中i表示行,j表示列。如果不存在滿足條件的山峰,輸出-1 -1。測試數據不存在多個同樣高度的最低洼地。
輸入樣例:
個人對題目的理解
輸入為n*n的正方形數組,每個數據點的大小表示“山的高矮”,邊界一圈的數據不做考慮,固只需要考慮下圖中黃色框內的數據并將每個數據點與其上下左右四個點的大小作比較,選出符合條件的即可(圖中紅圈)
于是乎我自建了一個矩陣,不過需要用到numpy庫(考場上估計不行)
其中2,3,1是符合要求的
幾行代碼順利完成
輸出:
官方參考代碼
Map = [] res, resI, resJ = 2021, -1, -1 Col = eval(input()) for i in range(Col):Map.append(list(map(int, input().split()))) if Col < 3:print("-1 -1")exit() for i in range(1, Col-1):for j in range(1, Col-1):if Map[i][j] < Map[i-1][j] and Map[i][j] < Map[i+1][j] and Map[i][j] < Map[i][j-1] and Map[i][j] < Map[i][j+1]:if Map[i][j] < res:res, resI, resJ = Map[i][j], i, j print(resI+1, resJ+1)與官方參考答案主要思想是一致的,但是我不知道如何輸入一個矩陣,這回學習到了!
總結
以上是生活随笔為你收集整理的2020全国高校计算机能力挑战赛程序设计赛Python组区域赛(初赛)试题及参考解答的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 7-36至7-40
- 下一篇: Openstack实验笔记