# 112 商業類程式設計技藝競賽-模擬試題
題目出處:[點我](https://sci.me.ntnu.edu.tw/PortalFile/ContestData/10116/24f3c648-fed4-4680-8a79-db42708208eb.pdf)
## ==建議看完題目再來看這裡。==
## pA. 電腦教室
尋找最大值即可。
```python=
n=int(input())
a=[int(i) for i in input().split()]
print(max(a))
```
## pB. 幾何圖形多面體
使用if來判斷文字是何種圖形,並定義個變數加上該圖形有的面數,最後印出即可。
```python=
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 × 𝑡 即可。
```python=
while True:
try:
u,t = map(int,input().split())
except:
break
print(2*u*t)
```
## pD. 買鉛筆
人數除於12,商數 × 50,餘數 × 5 相加即可。
```python=
n=int(input())
print(50*(n//12)+5*(n%12))
```
## pE. 出現最多次的正整數
建表,把出現過的值丟入相應的 index 裡,當數值是裡面出現最多時,在印出。
```python=
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. 蛋糕
小蛋糕加起來的面積一定等於大蛋糕的面積,所以把小蛋糕的長*寬相加,然後除於大蛋糕的寬度就是大蛋糕的長度。
:::info
沒錯這題我想很久,結果洗個澡就想到了。
:::
```python=
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)=
\begin{cases}
dp[0]=1\\
dp[n]=(n+1)^2+dp[n-1]& \text{if n > 0}
\end{cases}
$$
寫成一般式就會是`dp[n]=(n+1)**2+dp[n-1]`
答案就會是`dp[n-1]`
```python=
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即可。
```python=
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)`即可。
```python=
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)=
\begin{cases}
d=1 & \text{if n = 1}\\
d[n]=d[n-1]+n-1 & \text{if n > 1}
\end{cases}
$$
一般式為`d[n] = d[n-1]+(n-1)`
```python=
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])
```
其實數字不大也能一般加到底
```python=
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位。
```python=
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 可以切換型態的方式做總和。
```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. 快樂數
數字不大,可以使用遞迴解
```python=
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)
```
不遞迴版本
```python=
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 ,就可以求出當天是星期幾。
```python=
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$。面積就要 $\geq d$ ,就變成:
$$(s+n)*(n-s+1)/2 \geq d$$
化簡就變成:
$$ n^2+n \geq 2*d+s^2-s $$
```python=
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寫法
```python=
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))
```
字典寫法
```python=
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
```python=
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