# ☄️CSF程速勁賽 決賽題庫
###### tags: `CSF`
## 202107 CSF程速勁賽 決賽 1-繪製圖形
**1. 設計說明:
請撰寫一程式輸入繪製模式、圖形個數,以 * 號繪製出對應圖形,每一列最右邊的 * 號不能有空白出現,如下所示:**
(圖中的黃點代表空格)

```python=
m=int(input())
n=int(input())
for i in range(n*2):
if i%2==m:
print(' *\n * *\n* *\n* *')
else :
print('* *\n* *\n * *\n *')
```
## 202107 CSF程速勁賽 決賽 2-最少月台數
1. 設計說明:
請撰寫一程式輸入火車到某一站的抵達與離開時間,計算並輸出不讓到站火車延遲的最少月台數。以範例輸入1為例:
輸入值為
1.2,1.5,1.5,2.3
2.3,2.8,2.5,2.5
代表共有4列火車,其抵達與離開某一站的時間如下表所示:
火車 a b c d
抵達時間 1.2 1.5 1.5 2.3
離開時間 2.3 2.8 2.5 2.5
則需要最少月台數為3,其中
火車 時間 抵達/離開 月台
a 1.2 抵達 1
b 1.5 抵達 2
c 1.5 抵達 3
a 2.3 離開 1
d 2.3 抵達 1
c 2.5 離開 3
d 2.5 離開 1
b 2.8 離開 2
註:火車a的離開時間與火車d的抵達時間一樣,可共用一個月台

```python=
t_in=str(input())
arrive=[eval(i) for i in t_in.split(',')]
t_out=str(input())
leave=[eval(i) for i in t_out.split(',')]
time=[]
for i in range(len(arrive)):
time.append((arrive[i],1))
time.append((leave[i],0))
time.sort()
m=0
c=0
for _,i in time:
if i :
c+=1
m=max(m,c)
else :
c-=1
print(m)
```
```python=
from xmlrpc.client import MININT
inArr=input().split(",")
outArr=input().split(",")
for i in range(len(inArr)):
inArr[i]=eval(inArr[i])
for i in range(len(outArr)):
outArr[i]=eval(outArr[i])
# print(inArr)
# print(outArr)
for i in range(len(inArr)):
for j in range(i,len(inArr)):
if inArr[i]>inArr[j]:
tmp=inArr[i]
inArr[i]=inArr[j]
inArr[j]=tmp
tmp=outArr[i]
outArr[i]=outArr[j]
outArr[j]=tmp
# print(inArr)
# print(outArr)
arr=[]
for i in range(len(inArr)):
if len(arr)==0:
arr.append([inArr[i],outArr[i]])
continue
minLen=999999
minIn=0
minOut=0
minIndex=0
tmp=0
for j in range(len(arr)):
if inArr[i]>=arr[j][1] and outArr[i]>=arr[j][1]:
tmp+=1
if inArr[i]-arr[j][1]<minLen:
minLen=inArr[i]-arr[j][1]
minIn=inArr[i]
minOut=outArr[i]
minIndex=j
if tmp==0:
arr.append([inArr[i],outArr[i]])
else:
arr[minIndex][1]=outArr[i]
# print(arr)
print(len(arr))
```
```python=
# t_in=str(input())
# arrive=[eval(i) for i in t_in.split(',')]
# t_out=str(input())
# leave=[eval(i) for i in t_out.split(',')]
# arrive.sort()
# leave.sort()
# ans=0
# m=0
# seq = (i/10 for i in range(0, 240))
# for i in seq:
# if i in arrive :
# ans+=1
# m=max(ans,m,arrive.count(i))
# if i in leave :
# ans-=1
# print(m)
```
## 202107 CSF程速勁賽 決賽 3-最大滿意人數
1. 設計說明:
系統要幫民眾安排施打疫苗的時段,會先排定預設時段(0, 1, 2, ...)進行施打,但民眾可依自己想施打的的滿意時段進行變更,方式如下:
預設時段:依順序安排(0, 1, 2, ...),每個時段只有一人。
變更方式:
每人都有一個滿意時段。
時段只能變更一次。
除非能換到自己滿意的時段,否則不願意變更。
請撰寫一程式,依序輸入每一位民眾的滿意時段,計算並輸出有幾位民眾可以在自己的滿意時段施打疫苗。以範例輸入1為例:
輸入值為
2,2,0,5,3,5,7,4


```python=
def f(lst,ch_t=None):
if ch_t is None : #初始化
ch_t=set(range(len(lst)))
if len(ch_t)==1:
return ch_t
like=set(lst[x] for x in ch_t) #取出
remove_set=ch_t-like #沒人滿意的時段
if remove_set:
ch_t-=remove_set #以沒人滿意排除不能變更的人
f(lst,ch_t)
return ch_t
n=input()
a=[eval(i) for i in n.split(',')]
peo=f(a)
print(len(peo))
```
## 202112 CSF程速勁賽 決賽 1-小黑與他的便當店戀情
**小黑暗戀巷口便當店的女店員。**
**為了能跟可愛的店員見上一面,他常常去店裡消費,而且他都點店裡最貴的150元豪華便當,希望讓店員覺得他是個豪氣的人。**
**最近便當店推出集點活動,每次買便當可以拿到1點,只要集到5點就可以折50元。**
**小黑覺得這是老闆在暗中撮合他跟女店員,於是決定把這個月的餐費都拿來買這家的便當,請問他可以買幾個便當?**

```python=
money=eval(input())
point=0#點數
food=0#便當
while(money>=150):
point+=1
money-=150
food+=1
if point==5:
point=0#點數規0
money+=50#便當變為100
print(food)
```
```python=
n=int(input())
cnt=0
while n>=150:
cnt+=1
n-=150
if cnt%5==0:
n+=50
print(cnt)
```
```python=
n=int(input())
p=0
a=0
while n>=0 :
if p>=5:
p-=4 #超過5點又可以拿到1點 =4
n-=100 #打折50塊錢,所以這個便當只要100
else :
n-=150
p+=1
a+=1
print(a)
```
## 202112 CSF程速勁賽 決賽 2-多少個騎士

騎士(Knight) 是西洋棋中的一種棋子。走法是走「日」字,或英文字母大写的 “L” 形:即先向左(或右)走1格,再向上(或下)走2格;或先向左(或右)走2格,再向上(或下)走1格。
請問在一個 $m * n$ 大小的棋盤下,最多可以同時放下幾個騎士,使得任一個騎士無法吃掉其他騎士(只走一步的情況)?
2. 輸入輸出
**輸入說明**
第一列:$m, n$ 分別代表棋盤的長、寬($1 \leq m, n \leq 500$)
**輸出說明**
輸出最多可以同時放下幾個騎士,使得任一個騎士無法吃掉其他騎士





```python=
# by TFH
m,n=(input().split(" "))
m=int(m)
n=int(n)
def f(n,m):
if n<m:
return f(m,n)
elif m==1:
return n
elif m==2:
if (n%4>1):
return (n//4)*4+2*2 #4個4個一組,有幾組
else:
return (n//4)*4+(n%4)*2
#奇數的話中間可以多放一個
else:
return (n*m+1)//2
print(f(m,n))
```
## 202112 CSF程速勁賽 決賽 3-5倍券精算師

**100為單位**

```python=
a=[int(eval(x)/100) for x in input().split(' ')]
dp=[False]*51
dp[0]=True
for i in range(len(a)):
for j in range(50,a[i]-1,-1):
dp[j]=dp[j] or dp[j-a[i]]
if dp[50]:
print(i+1)
break
```
## 202205 CSF程速勁賽 決賽 2-三角旗設計圖
1. 設計說明:
校慶的班級布置中,你的工作是依照需求完成三角旗的設計。
三角旗是由若干個倒立實心的等腰三角形組成,數量不超過5個。
請設計一程式,根據使用者輸入的三角形腰長,用 * 印出對應三角旗的形狀。
2. 輸入輸出:
輸入說明
不超過5個數字(大於等於0的數字),代表等腰三角形的腰長(以半形空格為間隔)
輸出說明
用 * 輸出對應的三角旗形狀,每個三角形之間需有一個半形空格
(每一列的最後一個 * 右側沒有空格)

```py=
arr=[int(i) for i in input().split(" ")]
ans=[]
for i in range(len(arr)):
for j in range((arr[i])):
ans.append(("*"*(j+1)).ljust(max(arr)))
for j in range((arr[i])-1):
ans.append(("*"*(arr[i]-j-1)).ljust(max(arr)))
if arr[i]!=0:
ans.append((" ")*(max(arr)))
# print(ans)
for i in range((max(arr))):
tmp=""
for j in range(len(ans)-1):
tmp+=ans[j][i]
print(tmp.rstrip(),end="")
# print("o",end="") #取消註解可以證明沒空白
if i != (max(arr))-1:
print()
```