# APCS實作題練習(詳解) ###### tags: `APCS` ## 【題解】ZeroJudge h081: 1. 程式交易 https://zerojudge.tw/ShowProblem?problemid=h081 ![](https://i.imgur.com/3RKH5Sd.png) ```python= #python n,d=map(int,input().split()) m=list(map(int,input().split())) x=m[0] # 現在持有股票的金額 ans=y=0 # y = 賣掉後,的最後金額 for i in range(1,len(m)): if(x!=-1): # 要是有股票 if(m[i]>=x+d): # 且現在金額 >=原本持有 +d ans+=m[i]-x # 賺錢 x=-1 # 設為賣掉 y=m[i] # 賣掉後,的最後金額 else : #沒有股票 if(m[i]<=y-d): # 且現在金額 <=原本持有-d x=m[i] #設定,現在持有的股票金額 print(ans) ``` ## 【題解】ZeroJudge h082: 2. 贏家預測 https://zerojudge.tw/ShowProblem?problemid=h082 ![](https://i.imgur.com/DuYi3SN.png) ![](https://i.imgur.com/Wfxfjnk.png) ```python= n,m=map(int,input().split()) k=[0]+[int(x) for x in input().split()] # 戰力 p=[0]+[int(x) for x in input().split()] # 應變力 alive=[int(x) for x in input().split()] # 編號 n_lose=[0]*(n+1) while(len(alive)>1): #存活大於1個,繼續打 winner =[] loser=[] #不能到最後,不然沒人打 for i in range(0,len(alive)-1,2): # 兩個兩個打 f,s=alive[i],alive[i+1] # 2 個對打 alive照編號排的,不會有0號,所以前面k=[0]+[int(x) for x in input().split()]要補0 a,b,c,d=k[f],p[f],k[s],p[s] # a (1)戰力 b(1)應變力 c (2)戰力 d(2)應變力 if(a*b>=c*d): #對打 win=f k[f]+=c*d//(2*b) p[f]+=c*d//(2*a) lose=s k[s]+=c//2 p[s]+=d//2 else : win=s k[s]+=a*b//(2*d) p[s]+=a*b//(2*c) lose=f k[f]+=a//2 p[f]+=b//2 winner.append(win) #贏的編號 n_lose[lose]+=1 #輸的,敗場 +1 if(n_lose[lose]<m): #<m 才可以存活 loser.append(lose) if(len(alive)%2==1) : #要是有烙單 winner.append(alive[-1]) # 放在存活的最後一個 ([-1]就是隊伍的最後一個) alive=winner +loser #贏前 輸後 print(alive[0]) ``` ## 【題解】ZeroJudge g595: 1. 修補圍籬 https://zerojudge.tw/ShowProblem?problemid=g595 ![](https://i.imgur.com/mOlOtas.png) ![](https://i.imgur.com/ilrvr1c.png) ```python= n=int(input()) m=[int(x) for x in input().split()] ans=0 for i in range(0,len(m)): if( i==0 and (m[i]==0)): #要是是在最左邊,且圍籬斷掉 ans+=m[i+1] #直接加右邊的值 continue #強制跳出 ❮本次❯ 迴圈,繼續進入下一圈 if( i==len(m)-1 and (m[i]==0)): #要是是在最右邊,且圍籬斷掉 ans+=m[i-1] #直接加左邊的值 continue #強制跳出 ❮本次❯ 迴圈,繼續進入下一圈 if(m[i]==0): #有斷掉 ans+=min(m[i-1],m[i+1]) #找左右小的,並加上去 print(ans) ``` ## 【題解】ZeroJudge g596: 2. 動線安排 ### @@待修改 ![](https://i.imgur.com/EfAonNj.png) ![](https://i.imgur.com/Zz8dbOq.png) ```python= # 1水平 2垂直 1+2=3十字 0 空白 4柱子 def rem(r,c): #拔柱子 global m,n a[r][c]=0 i=c-1 #往左邊找 while(i >=0 and (a[r][i]==1 or a[r][i]==3)): #當沒有出界,且是線 a[r][i]-=1 #清除 水平線 -1 直接清空 十字線 -1 變成只有水平線 i-=1 #繼續往左 i=c+1 #往右邊找 while(i <n and (a[r][i]==1 or a[r][i]==3)) : #當沒有出界,且是線 a[r][i]-=1 #清除 水平線 -1 直接清空 十字線 -1 變成只有水平線 i+=1 #繼續往右 i=r-1 #往下邊找 while(i >=0 and (a[i][c]==2 or a[i][c]==3)) : #當沒有出界,且是線 a[i][c]-=2 i-=1 i=r+1 #往上邊找 while(i <m and (a[i][c]==2 or a[i][c]==3)) : #當沒有出界,且是線 a[i][c]-=2 i+=1 def add(r,c): global m,n if (a[r][c]!=2 and a[r][c]!=3): r2=r-1 while(r2 >=0 and a[r2][c]!=4) : r2-=1 if(r2>=0) : for i in range(r-1,r2,-1): a[i][c]+=2 r2=r+1 while(r2 <m and a[r2][c]!=4) : r2+=1 if(r2<m) : for i in range(r+1,m,1): a[i][c]+=2 if(a[r][c]!=1 and a[r][c]!=3) : c2=c-1 #當沒有出界,且不是柱子 while(c2 >=0 and a[r][c2]!=4) : c2-=1 #繼續往左 if(c2>=0): #找到柱子 for i in range(c-1,c2,-1): a[r][i]+=1 #拉線 c2=c+1 while(c2 <n and a[r][c2]!=4) : c2+=1 #繼續往右 if(c2<n): for i in range(c+1,c2,1): a[r][i]+=1 #拉線 a[r][c]=4 total=0 #每回合非空格數量 mymax=0 #最大值 m,n,h=map(int,input().split()) a=[[0]*n for j in range(m)] #二維陣列出話 for i in range(h): r,c,indel=map(int,input().split()) if indel==0: add(r,c) else : rem(r,c) total=0 for i in range(m): total+=n-a[i].count(0) if total>mymax: mymax=total print(mymax) print(total) ``` ## 【題解】ZeroJudge g275: 1. 七言對聯 ![](https://i.imgur.com/T4AXfcq.png) ```python= n=int(input()) for i in range(n): a = list(map(int,input().split())) b = list(map(int,input().split())) aa=bb=cc=True if(a[1]!=a[3] and a[1]==a[5] and b[1]!=b[3] and b[1]==b[5]): aa=True else : aa=False print('A',end='') if(a[6]==1 and b[6]==0): bb=True else : bb=False print('B',end='') if(a[1]!=b[1] and a[3]!=b[3] and a[5]!=b[5]): cc=True else : cc=False print('C',end='') if(aa==True and bb==True and cc==True): print('None',end='') print() ``` ## 【題解】ZeroJudge g276: 2. 魔王迷宮 修改 ![](https://i.imgur.com/UGceoXr.png) ```python= n=int(input()) for i in range(n): s=input() ans=1 for j in range(0,len(s)): ans*=int(s[j]) print(ans) ``` ## 【題解】f605: 1. 購買力 ![](https://i.imgur.com/FYlg0fq.png) ```c= //c++ #include<iostream> #include<algorithm> using namespace std; int main() { int n,d; cin>>n>>d; int total=0; int num=0; for (int i=0;i<n;i++) { int arr[3]; cin>>arr[0]>>arr[1]>>arr[2]; sort(arr,arr+3); if(arr[2]-arr[0]>=d) { int a=0; a=((arr[0]+arr[1]+arr[2])/3); total+=a; num++; } } cout<<num<<" "<<total; } ``` :::