# APCS 2016/10 題解 ## ==三角形辨別== ### 題目 [三角形辨別](https://zerojudge.tw/ShowProblem?problemid=c294) ### 核心 條件判斷 ### 思路 ```c++= #include<bits/stdc++.h> using namespace std; int main() { int A[3]; scanf("%d%d%d",A,A+1,A+2); sort(A,A+3); for(int i=0;i<3;i++) printf("%d ",A[i]); printf("\n"); if(A[0]+A[1]<=A[2]) printf("No"); else if(A[0]*A[0]+A[1]*A[1]==A[2]*A[2]) printf("Right"); else if(A[0]*A[0]+A[1]*A[1]<A[2]*A[2]) printf("Obtuse"); else printf("Acute"); } ``` ## ==最大和== ### 題目 [最大和](https://zerojudge.tw/ShowProblem?problemid=c295) ### 核心 條件判斷 ### 思路 ```c++= #include<bits/stdc++.h> using namespace std; int num[20][20]; int main() { int n,m,i,j; scanf("%d%d",&n,&m); int S=0,maxNum[20]; for(i=0;i<n;i++) { maxNum[i]=-1; for(j=0;j<m;j++) { scanf("%d",&num[i][j]); maxNum[i]=max(maxNum[i],num[i][j]); } S+=maxNum[i]; } printf("%d\n",S); bool can=false; for(i=0;i<n;i++) { if(!(S%maxNum[i])) { printf("%d",maxNum[i]); can=true; break; } } for(i=i+1;i<n;i++) { if(!(S%maxNum[i])) printf(" %d",maxNum[i]),can=true; } if(!can) printf("-1"); } ``` ## ==定時k彈== ### 題目 [定時k彈](https://zerojudge.tw/ShowProblem?problemid=c296) ### 核心 [約瑟夫問題](https://oi-wiki.org/misc/josephus/) ### 思路1 人數記n,幸運者記Lucky,上一個幸運者記lastLucky,下一個幸運者記:nextLucky,傳遞k次會爆炸。 若移除一人,則Lucky=(lastLucky+k)%n,因為(lastLucky+k-1)%n的人會被移除,再移除一人的話,則nextLucky=(Lucky+k)%(n-1)。 此時會發現一個問題,移除第二人開始,答案會變成當前順序值,記得處理。 ```c++= #include<bits/stdc++.h> using namespace std; int n,m,k; int main() { cin>>n>>m>>k; vector<int> V; for(int i=1;i<=n;i++) V.push_back(i); int LuckyValue=1,LuckyIndex=0; for(int i=0;i<k;i++) { LuckyIndex=(LuckyIndex+m-1)%n; V.erase(V.begin()+LuckyIndex); if(LuckyIndex==n-1) LuckyIndex=0; LuckyValue=V[LuckyIndex]; n--; } printf("%d\n",LuckyValue); } ``` ### 思路2(約瑟夫) 類似把思路1倒過來想,當人數有i時,tmp為(人數為i-1時的tmp+m)%i,也就是Lucky~i~=(Lucky~i-1~+m)%i,很奇妙的解法。 ```c++= #include<bits/stdc++.h> using namespace std; int n,m,k; int main() { cin>>n>>m>>k; int tmp=0; for(int i=n-k+1;i<=n;i++)tmp=(tmp+m)%i; cout<<tmp+1<<"\n"; } ``` ## ==棒球遊戲== ### 題目 [棒球遊戲](https://zerojudge.tw/ShowProblem?problemid=c297) ### 核心 模擬 ### 思路 怪題。 ```C++= #include<bits/stdc++.h> using namespace std; vector<string> info[9],turns; int cnt=0,outs; bool one=false,two=false,three=false; int main() { for(int i=0;i<9;i++) { int n; cin>>n; cnt+=n; info[i].assign(n,""); for(int j=0;j<n;j++) cin>>info[i][j]; } cin>>outs; for(int i=0;i<5&&cnt;i++) { for(int j=0;j<9&&cnt;j++) turns.push_back(info[j][i]),cnt--; } cnt=0; int scores=0; for(int i=0;i<turns.size();i++) { string turn=turns[i]; if(turn[0]=='S'||turn[0]=='G'||turn[0]=='F') { cnt++; if(!(cnt%3)) one=two=three=false; if(cnt==outs) break; } else if(turn[0]=='H') { if(one) scores+=1; if(two) scores+=1; if(three) scores+=1; scores+=1; one=two=three=false; } else { int num=turn[0]-'0'; if(num==1) { if(three) scores+=1,three=false; if(two) three=true,two=false; if(one) two=true,one=false; one=true; } else if(num==2) { if(three) scores+=1,three=false; if(two) scores+=1,two=false; if(one) three=true,one=false; two=true; } else { if(three) scores+=1,three=false; if(two) scores+=1,two=false; if(one) scores+=1,one=false; three=true; } } } cout<<scores<<endl; } ```