生活大爆炸版石頭剪刀布-簡單模擬
阿新 • • 發佈:2018-11-27
連結傳送門:https://www.luogu.org/problemnew/show/P1328
理解題意後一般大家的思路都是這樣的:
逐個比較嘛, 反正資料也不大,就200, 如何比較? 當然是用 if 嘛, 羅列所有的情況,反正情況也不對。
寫出來的程式碼就是這樣的
#include <cstdio> using namespace std; const int MAXN = 200+7; int a1[MAXN]; int a2[MAXN]; int n, n1, n2; int main() { while(scanf("%d%d%d", &n, &n1, &n2) != EOF) { int score_a = 0; int score_b = 0; for(int i=0; i<n1; i++) scanf("%d", &a1[i]); for(int i=0; i<n2; i++) scanf("%d", &a2[i]); for(int i=0; i<n; i++) { a1[i] = a1[i%n1]; a2[i] = a2[i%n2]; } for(int i=0; i<n; i++) { switch(a1[i]) { case 0: if(a2[i] == 2 || a2[i] == 3) score_a ++; else if(a2[i] == 0) break; else score_b ++; break; case 1: if(a2[i] == 0 || a2[i] == 3) score_a ++; else if(a2[i] == 1) break; else score_b ++; break; case 2: if(a2[i] == 1 || a2[i] == 4) score_a ++; else if(a2[i] == 2) break; else score_b ++; break; case 3: if(a2[i] == 2 || a2[i] == 4) score_a ++; else if(a2[i] == 3) break; else score_b ++; break; case 4: if(a2[i] == 0 || a2[i] == 1) score_a ++; else if(a2[i] == 4) break; else score_b ++; break; } } printf("%d %d\n", score_a, score_b); } return 0; }
這個思路簡單易懂,一點問題也沒有。都是if,執行起來也很快,這也是我看到這道題的第一個想法。
然後我看到討論區裡有說打表的,然後就覺得這個方法更簡潔,程式碼也簡單,然後就仔細思考一下,寫了一個新的程式碼。
#include <cstdio> using namespace std; const int MAXN = 200+7; int score[5][5] = { {0, 0, 1, 1, 0}, {1, 0, 0, 1 ,0}, {0, 1, 0, 0, 1}, {0, 0, 1, 0, 1}, {1, 1, 0, 0, 0} }; int a1[MAXN]; int a2[MAXN]; int main() { int n, n1, n2; while(scanf("%d%d%d", &n, &n1, &n2) != EOF) { int ans1 = 0; int ans2 = 0; for(int i=0; i<n1; i++) scanf("%d", &a1[i]); for(int i=0; i<n2; i++) scanf("%d", &a2[i]); for(int i=0; i<n; i++) { ans1 += score[a1[i % n1] ][a2[i % n2] ]; ans2 += score[a2[i % n2] ][a1[i % n1] ]; } printf("%d %d\n", ans1, ans2); } return 0; }