# 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運算。