Try   HackMD

112 商業類程式設計技藝競賽-模擬試題

題目出處:點我

建議看完題目再來看這裡。

pA. 電腦教室

尋找最大值即可。

n=int(input()) a=[int(i) for i in input().split()] print(max(a))

pB. 幾何圖形多面體

使用if來判斷文字是何種圖形,並定義個變數加上該圖形有的面數,最後印出即可。

n=int(input()) s=0 #總和 for _ in range(n): a=input() if a=="Tetrahedron": s+=4 elif a=="Cube": s+=6 elif a=="Octahedron": s+=8 elif a=="Dodecahedron": s+=12 elif a=="Icosahedron": s+=20 print(s)

pC. 等加速度位移

把輸入的 u 跟 t 帶入 𝑆(2𝑡)=2 × u × 𝑡 即可。

while True: try: u,t = map(int,input().split()) except: break print(2*u*t)

pD. 買鉛筆

人數除於12,商數 × 50,餘數 × 5 相加即可。

n=int(input()) print(50*(n//12)+5*(n%12))

pE. 出現最多次的正整數

建表,把出現過的值丟入相應的 index 裡,當數值是裡面出現最多時,在印出。

n=int(input()) a=[int(i) for i in input().split()] count=[0 for _ in range(10)] for i in a: count[i] += 1 for i in range(10): if count[i]==max(count): print(i,end=" ")

pF. 蛋糕

小蛋糕加起來的面積一定等於大蛋糕的面積,所以把小蛋糕的長*寬相加,然後除於大蛋糕的寬度就是大蛋糕的長度。

沒錯這題我想很久,結果洗個澡就想到了。

while True: try: bw=int(input()) except: break s=0 for _ in range(int(input())): a,b=map(int,input().split()) s+=a*b print(s//bw)

pG. 不同的正方形

透過遞迴關係我們能得知

dp(n)={dp[0]=1dp[n]=(n+1)2+dp[n1]if n > 0

寫成一般式就會是dp[n]=(n+1)**2+dp[n-1]

答案就會是dp[n-1]

dp=[0 for _ in range(101)] dp[0]=1 for i in range(1,101): dp[i] = (i+1)**2+dp[i-1] while True: n=int(input()) if n==0: break print(dp[n-1])

pH. Bubble 計算swaps次數

用 Bubble 排序好,每換一次 swaps 就加1,最後印出swaps即可。

t=int(input()) for _ in range(t): swaps=0 n=int(input()) train=[int(i) for i in input().split()] for i in range(n): for j in range(0,n-i-1): if train[j]>=train[j+1]: train[j],train[j+1] = train[j+1],train[j] swaps += 1 print(f'Optimal train swapping takes {swaps} swaps.')

pI. 鬧鈴的時間

把小時換成分鐘,如果 m2 >= m1 ,直接用 m2-m1 就是解答。如果是 m1 比較大的話,就用 144-(m1 - m2)即可。

while True: h1,m1,h2,m2=map(int,input().split()) if h1==m1==h2==m2==0: break m1=h1*60+m1 m2=h2*60+m2 if m1>m2: print(1440-(m1-m2)) else: print(m2-m1)

pJ. 求數列第n項

用動態規劃即可。遞迴關係式為:

d(n)={d=1if n = 1d[n]=d[n1]+n1if n > 1 一般式為d[n] = d[n-1]+(n-1)

import sys dp = [0, 1] head = 2 for i in sys.stdin: i = int(i) if len(dp) <= i: for j in range(head, i+1): dp.append(j-1+dp[j-1]) head = i+1 print(dp[i])

其實數字不大也能一般加到底

import sys for i in sys.stdin: i = int(i) d = 1 for j in range(1, i): d += j print(d)

pK. 表演座位

沒什麼特別的,一直比較即可。要注意的是一跟三區是每排25位,第二區是50位。

seat=int(input()) if seat<=2500: if seat%25==0 and seat!=2500: print(f'1 {seat//25} 25') elif seat==2500: print(f'1 100 25') else: print(f'1 {seat//25+1} {seat%25}') elif seat<=7500: seat-=2500 if seat%50==0 and seat!=5000: print(f'2 {seat//50} 50') elif seat==5000: print(f'2 100 50') else: print(f'2 {seat//50+1} {seat%50}') else: seat-=7500 if seat%25==0 and seat!=2500: print(f'3 {seat//25} 25') elif seat==2500: print(f'3 100 25') else: print(f'3 {seat//25+1} {seat%25}') n = int(input()) if 0 <= n <= 2500: print(1, 1 if n <= 25 else n//25+1 if n%25 else n//25,n%25 if n%25 else 25) elif 2501 <= n <= 7500: n -= 2500 print(2, 1 if n <= 50 else n//50+1 if n%50 else n//50, n%50 if n%50 else 50) else: n -= 7500 print(3, 1 if n <= 25 else n//25+1 if n%25 else n//25,n%25 if n%25 else 25)

pL. 數字的總和

利用 python 可以切換型態的方式做總和。

while True: n=input() if n=='0':break while len(n)>1: n=str(sum([int(i) for i in n])) print(n)

pM. 快樂數

數字不大,可以使用遞迴解

def happy(i,n,first): try: if n==1: print(f'Case #{i}: {first} is a Happy number.') else: new = str(n) sum = 0 for c in new: sum += int(c)**2 return happy(i,sum,first) except: print(f'''Case #{i}: {first} is an Unhappy number.''',end='\n') n=eval(input()) for i in range(1,n+1): a = eval(input()) happy(i,a,a)

不遞迴版本

for _ in range(1, int(input())+1): n = N = int(input()) seen = set() while n != 1: if n in seen: print(f"Case #{_}: {N} is an Unhappy number.") break seen.add(n) temp = 0 for i in str(n): temp += int(i)**2 n = temp else: print(f"Case #{_}: {N} is a Happy number.")

pN. 輸出星期幾

用內建模組 datetime 裡的 weekday ,就可以求出當天是星期幾。

from datetime import date t=int(input()) w=['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'] for _ in range(t): M,D=map(int,input().split()) week=date(2023,M,D).weekday() print(w[week])

pO. 飯店

梯形公式推導而成

s 為第一項,公差為
1
。面積就要
d
,就變成:
(s+n)(ns+1)/2d
化簡就變成:
n2+n2d+s2s

while True: try: s,d = map(int,input().split()) except: break find=d*2+s**2-s ans=int(find**(1/2)) if ans*(ans+1)<find: ans+=1 print(ans)

pP. 霍夫曼編碼

class寫法

class Node: #初始化節點 def __init__(self, n, leaf): self.n = n self.left = None self.right = None self.leaf = leaf def visit(self, d): temp = 0 if self.leaf: return d temp += self.left.visit(d+1) temp += self.right.visit(d+1) return temp n = int(input()) tree = [] num = [int(i) for i in input().split()] for i in range(n): temp = Node(num[i], 1) num[i] = temp tree.append(temp) while len(num) > 1: num.sort(key=lambda x: x.n, reverse=True) a = num.pop() b = num.pop() temp = Node(a.n+b.n, 0) temp.left = a temp.right = b num.append(temp) print(num[0].visit(0))

字典寫法

n = int(input()) num = [int(i) for i in input().split()] d = {} co = num.copy() while len(num) > 1: #創造樹 num.sort() n1 = num.pop(0) n2 = num.pop(0) temp = n1 + n2 d[n1] = [temp] d[n2] = [temp] num.append(temp) p = num[0] def dfs(k): q = [k] seen = set() seen.add(k) head = 0 time = 0 while head < len(q): node = q[head]; head += 1 if node == p: break for i in d[node]: if i not in seen: q.append(i) seen.add(i) time += 1 return time ans = 0 for i in co: ans += dfs(i) print(ans)

pQ. 逆序數對數量

時間優化BIT

def check(): ans=0 for i in range(len(l)): for j in range(i+1,len(l)): if l[i]>l[j]: ans+=1 return ans n,m=map(int,input().split()) l=[i for i in range(1,n+1)] for _ in range(m): a,b=map(int,input().split()) a=l.index(a) b=l.index(b) l[a],l[b]=l[b],l[a] print(check())

TLE