2024年1月15日 星期一

h206. 強者就是要戰,但......什麼才是強者呢?

         這題是很好的遞迴問題,每次遞迴的時候都要帶入此次遞迴的左右邊界、及這次是要取區間最大還是取區間最小的flag。

        完整程式如下:

def t(l , r , isBig):
    if l == r-1:
        return d[l]
    m = (l+r)//2
    if isBig: 
        g = max(t(l,m,0) , t(m,r,0))
    else:
        g = min(t(l,m,1) , t(m,r,1))
    return g
        
n = int(input())
d = [int(i) for i in input().split()]

print(t(0,n,1))

h631. 美麗人生

         白話來說,就是把測資去掉所有2、3、5的因數後,如果只剩下1,就顯示ugly,反之顯示beautiful,這邊就運用while來重複檢測輸入是否尚能被2、3、5整除,如果可以就將其整除後再檢查一次,直到不能在除2、3、5為止。

        程式碼如下:

def t():
    n = int(input())
    while n % 2 == 0:
        n //= 2
    while n % 3 == 0:
        n //= 3
    while n % 5 == 0:
        n //= 5
    if n == 1:
        print('ugly')
    else:
        print('beautiful')
        
t()

2024年1月12日 星期五

e315. NOIP2017 1.成绩

         三個輸入乘以固定的比率,算出最終答案,如果是使用python要小心浮點數運算預設是帶小數的資料,記得要取整數。

        以下附上完整程式:

try:
    while True:
        p,n,m = [int(i) for i in input().split()]
        print(int(p*0.2+n*0.3+m*0.5))
except:
    pass

APCS 2024.01 m931. 1. 遊戲選角

         考試中常常用到排序,只是往往不會只是單純排序,有些時候,會需要在排序的資料裡面,添加一些不必要排序的資料,就像這題,表面是針對戰鬥力排名,但輸出的時候是要輸出攻擊力與防禦力,所以基本上的做法就是依序將[戰鬥力、攻擊力、防禦力]當成一筆資料塞入陣列之中,透過sort指令,因為系統預設的sort指令會先依第一個欄位排序,如果第一個欄位相同就繼續比第二個,以此類推。

        完整程式如下:

n = int(input())
p = []
for i in range(n):
    q,m = [int(i) for i in input().split()]
    p.append([q**2 + m**2 , q , m])
p.sort()

print(p[-2][1] , p[-2][2])

2024年1月11日 星期四

i025. 真因數和 (小 n)

         沒有太過分的求因數,小心避開當輸入為1、找因數的迴圈終點記得開根號處理,很多神奇的技巧如6n+1,6n-1,找因數的時候一次間隔兩個數....技巧都不需用上。

        以下附上完整程式碼:

def t():
    n = int(input())
    if n == 1:
        print(0)
        return
    p = int(n**0.5) + 1
    
    total = 0
    for i in range(1,p):
        if n % i == 0:
            j = n//i
            if j == i or j == n:
                total += i
            else:
                total += i + j
    print(total)
    
t()

f327. 刪除欄位

         這題就是單純的16進制轉換題,如果同樣的題目,是十進制出題,那是絕對的送分題,以十進制來看,假設收到三個char(a,b,c)需要我們將它組成一個百位數數字,那麼程式作法拆解下來就是total = a - char(0) ,再來是total = total * 10 + b - char(0) ,最後是total = total * 10 + c - char(0) ,數學式子去理解就是total = a * 100 + b * 10 + c,那麼將同樣概念運用在這題就沒問題了。

        以下附上完整程式:

d = input().split()

ft,st = 0,0
f,s = d
for i in range(len(f)):
    ft = ft * 26 +  (ord(f[i]) - ord('A')+1) 
for i in range(len(s)):
    st = st * 26 +  (ord(s[i]) - ord('A')+1) 
print(st - ft + 1)

2024年1月9日 星期二

k740. 楊輝三角形

        這題是標準的DP問題,扣除每一行的頭跟尾(都是1),每一行的資料都是由上一行的正上方與左上方提供。

        以下附上完整程式碼:

n = int(input())
d = [[1 for i in range(21)] for j in range(21)]

for i in range(1,n+1):
    for j in range(i):
        if j != 0 and j != i-1:
            d[i][j] = d[i-1][j] + d[i-1][j-1]
        print(d[i][j] , end = ' ')
    print()

h206. 強者就是要戰,但......什麼才是強者呢?

         這題是很好的遞迴問題,每次遞迴的時候都要帶入此次遞迴的左右邊界、及這次是要取區間最大還是取區間最小的flag。         完整程式如下: def t (l , r , isBig) : if l == r -1 : retur...