# 112 學年度商業類學生技藝競賽
**題目出處:**[點擊](https://sci.me.ntnu.edu.tw/PortalFile/ContestData/10239/627a578c-8d17-49d0-9a7b-f9f44bcdbd3c.pdf)
# pA. 二數有權重的相加–(單列)
```python=
a,b=map(int,input().split())
print(4*a+6*b)
```
# pB. 剪刀石頭布單行版
```python=
n1,n2=input().split()
if n2==n1:
print(0)
elif n1=='Y':
if n2=='O':
print(2)
else:
print(1)
elif n1=='O':
if n2=='X':
print(2)
else:
print(1)
else:
if n2=='Y':
print(2)
else:
print(1)
```
# pC. 閏年
```python=
n=int(input())
n+=1911
if n%4==0 and n%100!=0 or n%400==0:
print(True)
else:
print(False)
```
# pD. ASCII碼
```python=
n=int(input())
if 122>=n>=97:
print(2)
elif 90>=n>=65:
print(1)
else:
print(0)
```
# pE. 2的冪
```python=
n=int(input())
a=1
while 2**a<=n:
a+=1
print(2**(a-1))
```
# pF. 質因數分解
```python=
n = int(input())
ans = []
while n != 1:
for i in range(2, int(n**0.5)+1):
if not(n%i):
ans.append(i)
n //= i
break
else:
ans.append(n)
break
print(*ans)
```
# pG. 因數加總
```python=
n=int(input())
ans=0
for i in range(1,n+1):
if n%i==0:
ans+=i
print(ans)
```
# pH. 數字運算(減1或除以10)
```python=
n,times=map(int,input().split())
while times:
if n%10!=0:
n-=1
else:
n//=10
times-=1
print(n)
```
# pI. 數字相加
```python=
t=int(input())
for _ in range(t):
n=int(input())
l=[int(i) for i in input().split()]
l,target=l[0:n-1],l[-1]
l.sort()
flag=False
for i in range(len(l)):
if l[i]>=target:
break
for j in range(i+1,len(l)):
if l[i]+l[j]==target:
flag=True
break
if l[i]+l[j]>target:
break
if flag:
break
if flag:
print('YES')
else:
print('NO')
```
# pJ. 七段顯示器
貪心者法則
性價比最高就是1,1用來衝位數,當n為奇數就把多的一段拿來當7放最前面,就會是最大數。
```python=
for _ in range(int(input())):
n=int(input())
ans='1'*(n//2)
if n%2:
ans='7'+ans[1:]
print(ans)
```
# pK. 字串
```python=
for _ in range(int(input())):
input()
n = input()
seen = set()
for i in range(len(n)-1):
seen.add(n[0:i]+n[i+2::])
print(len(seen))
```
# pL. 中位數
```python=
t=int(input())
ans=[]
for i in range(t):
n=int(input())
ans.append(n)
ans.sort()
D=len(ans)//2
if len(ans)%2==0:
print((ans[D-1]+ans[D])//2)
else:
print(ans[D])
```
# pM. 分組
```python=
for _ in range(int(input())):
n, r = map(int, input().split())
arr = sorted([int(i) for i in input().split()])
ans = 0
temp = []
while len(arr):
temp.append(arr.pop())
if len(temp)*temp[-1] >= r:
temp =[]
ans += 1
print(ans)
```
# pN. 函數
```python=
n = int(input())
print(-(n//2+1) if n%2 else n//2)
```
# pO. 洗牌
```python=
n, m = map(int, input().split())
arr = input().split()
mid = n//2
for _ in range(m):
temp = []
for i in range(mid):
temp.append(arr[i])
temp.append(arr[mid+i])
arr = temp.copy()
print(*arr)
```
# pP. 魔術方陣
```python=
arr=[]
for _ in range(3):
arr.append([int(i) for i in input().split()])
a=sum(arr[0][1::])
b=(arr[1][0]+arr[1][2])
c=sum(arr[2][0:2])
S=(a+b+c)//2
arr[0][0]=S-a
arr[1][1]=S-b
arr[2][2]=S-c
for i in arr:
print(*i)
```
# pQ. 數字全部相加成本
霍夫曼編碼
```python=
while int(input()):
q = [int(i) for i in input().split()]
ans = 0
while len(q) > 1:
q.sort(reverse=True)
a, b = q.pop(), q.pop()
ans += a+b
q.append(a+b)
print(ans)
```
# pR. 樹的直徑
### 需要多練練
先看每一條樹的直徑,再用最長的樹來去算直徑。
BFS走訪
```python=
n = int(input())
l = [[] for _ in range(n+1)]
for _ in range(n-1):
a, b = map(int, input().split())
l[a].append(b)
l[b].append(a)
q = [1]
seen = [-1]*(n+1)
seen[1] = 0
head = 0
while head < len(q):
node = q[head]; head += 1
for i in l[node]:
if seen[i] == -1:
seen[i] = seen[node]+1
q.append(i)
i = seen.index(max(seen))
seen = [-1]*(n+1)
seen[i] = 0
q = [i]
head = 0
while head < len(q):
node = q[head]; head += 1
for i in l[node]:
if seen[i] == -1:
seen[i] = seen[node]+1
q.append(i)
print(max(seen))
```
# pS. 迴圈
### 需要多練練
BFS
```python=
n,m=map(int,input().split())
l=[[] for i in range(n+1)]
for _ in range(m):
a,b=map(int,input().split())
l[a].append(b)
l[b].append(a)
#print(l)
seen=set()
ans=0
for i in range(1,n+1):
if i not in seen:
que=[i];head=0
arr=[]
while head<len(que): #BFS
node=que[head];head+=1
for v in l[node]:
if v not in seen:
arr.append(v)
que.append(v)
seen.add(v)
if arr and all(len(l[num]) == 2 for num in arr): #如果arr裡有東西,而且每個點都是有兩條邊的
ans += 1
print(ans)
```
補充第22行:因為arr有可能沒東西,所以先判斷all是否為空值,再去做all運算。