郑州大学“战疫杯”大学生程序设计在线邀请赛(1)题解(Python版本)
生活随笔
收集整理的這篇文章主要介紹了
郑州大学“战疫杯”大学生程序设计在线邀请赛(1)题解(Python版本)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
“戰疫杯”大學生程序設計在線邀請賽(1)題解
1. 我的賬本
簡單模擬題:
用一個數組 a ,來統計每個人錢的情況
對于每次買飯的操作,如果1號買飯,1號對應的數也就是a[1] + 5 * 支付錢數即可,而其他的舍友,每次減少支付錢數即可,最后輸出沒有空行
a = [0] * 7 n = int(input()) for i in range(n):x,y = map(int,input().split())for j in range(1,7):# 如果讓舍友買飯,就減下錢數if j != x:a[j] -= y# 買飯的人加上錢數*5a[x] += (5*y) for i in range(1,7):if i != 6:print(a[i],end=" ")else:print(a[i],end="")2. 核酸檢測掃碼
原本想錯了,想成dfs判斷連通性的問題,寫了幾十行代碼,發現好多個聯通塊,輸出了十幾個點
后來仔細讀題,發現直接模擬開搞
思路:讀入每行的字符串之后,存入數組
另外開一個vis數組標記每次是否遍歷過該點,如果遍歷過直接跳過(用于剪枝,可以優化)
另外如果是0開頭的直接跳過,還有如果下方和右方點的數量小于8的直接跳過
需要判斷的只有1開頭的以及沒有遍歷過的,用64個字符逐個字符對比,如果對比成功,標記這64個點(不重復遍歷),并且加入開頭點的坐標
最后答案輸出前排一下序即可
n,m = map(int,input().split()) g = [] for i in range(n):g.append(input()) vis = [[0] * 1010 for _ in range(1010)] nums = [] s = "1111111110000001101111011011110110111101101111011000000111111111" for i in range(n):for j in range(m):if g[i][j] == '0' or vis[i][j] == 1 or i + 8 > n or j + 8 > m:continueif g[i][j] == '1':# 標記是否能夠對比成功flag = True# 逐字符遍歷時記錄下標cnt = 0for k in range(i,i+8):for l in range(j,j+8):if g[k][l] == s[cnt]:cnt += 1# 逐字符對比失敗跳出循環else:flag = Falsebreak# 對比成功后加入該頂點坐標 并標記該8*8方塊上的點if flag:nums.append([i,j])for k in range(i,i+8):for l in range(j,j+8):vis[k][l] = 1 nums.sort(key = lambda x: (x[0],x[1])) for i in range(len(nums)):print(nums[i][0],nums[i][1])3. 辛苦的樓長
大模擬直接開搞
# 測試組數 t = 3 nums = [] # 映射 dic = {"song" : 0,"jv":1,"liu":2} # 三個類型的數組 cnt1,cnt2,cnt3 = [],[],[] dish = [[0] * 3 for _ in range(3)] for i in range(t):n = int(input())s = []for j in range(n):ts = input()nums.append(ts)s.append(ts)morning,moon,night = 0,0,0for i in range(len(s)):s1,s2,s3,s4,s5 = s[i].split(" ")yuan,lou = s1[:-1],s1[-1]m = dic[yuan]# 通過映射的下標,簡化代碼dish[m][0] += int(s3)dish[m][1] += int(s4)dish[m][2] += int(s5)if m == 0:cnt1.append(s[i])if m == 1:cnt2.append(s[i])if m == 2:cnt3.append(s[i]) # 關鍵字排序 注意數組切片的 起始點和終點 cnt1.sort(key = lambda x : (int(x[4]),int(x[6:9]))) cnt2.sort(key = lambda x : (int(x[2]),int(x[4:7]))) cnt3.sort(key = lambda x : (int(x[3]),int(x[5:8]))) # 輸出答案 # 先輸出每個園區的點餐的宿舍數,早中晚的數量 # 再輸出每個園區降序排列后的字符串 print(len(cnt1),dish[0][0],dish[0][1],dish[0][2]) for i in range(len(cnt1)):print(cnt1[i]) print(len(cnt2),dish[1][0],dish[1][1],dish[1][2]) for i in range(len(cnt2)):print(cnt2[i]) print(len(cnt3),dish[2][0],dish[2][1],dish[2][2]) for i in range(len(cnt3)):print(cnt3[i])4. 等待做核酸
簡單模擬,比第三題難度小
沒有涉及任何概率論和期望的算法
用一個表簡單模擬一下樣例
| 去的時間 | 15 | 15 | 15 | 15 | 15 | 15 | 15 | 15 | 15 |
| 等待時間 | 0 | 0 | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
| 期望值 | 0 | 0 | 0 | 1/30 | 2/30 | 3/30 | 4/30 | 5/30 | 6/30 |
所以直接統計轉化一下時間為分鐘后,累加分子,分子是大于去的時間的累加和
(1 + 2 + … + 14) / 30 ,最后保留兩位小數輸出
不循環求和也可以通過等差公式來做,O(1)做法
(a1 + an ) * n / 2 ,這樣寫的轉換一下即可
數據范圍小無所謂了_
t = input().split("-") m = input() nums = [] t1,t2 = t[0],t[1] m1,m2 = int(t1[:2]) * 60 + int(t1[3:]), int(t2[:2]) * 60 + int(t2[3:]) for i in range(m1,m2+1):nums.append(i) m3 = int(m[:2]) * 60 + int(m[3:]) fz,fm = 0,len(nums) for i in range(len(nums)):if nums[i] > m3:fz += (nums[i] - m3) print("%.2f"%(fz/fm))總結
以上是生活随笔為你收集整理的郑州大学“战疫杯”大学生程序设计在线邀请赛(1)题解(Python版本)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Framework7——如何使用路由lo
- 下一篇: Python爬虫应用场景大全