1. 程式人生 > 其它 >P1328 [NOIP2014 提高組] 生活大爆炸版石頭剪刀布

P1328 [NOIP2014 提高組] 生活大爆炸版石頭剪刀布

題目傳送門
//P1328.cpp

#include <bits/stdc++.h>

using namespace std;
const int N = 210;
//0 表示“剪刀”,1 表示“石頭”,2 表示“布”,3 表示“蜥蜴人”,4表示“斯波克”。
//看圖打表寫出對陣雙方的勝負平結果二維陣列
//這個勝負平表是關鍵
int g[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 n;      //表示進行N次猜拳
int n1;     //小A出拳的週期長度
int n2;     //小B出拳的週期長度
int na[N];  //表示小A出拳的規律
int nb[N];  //表示小B出拳的規律
int s1;     //小A贏幾次
int s2;     //小B贏幾次

int main() {
    //資料讀入
    cin >> n >> n1 >> n2;
    for (int i = 0; i < n1; i++)cin >> na[i];
    for (int i = 0; i < n2; i++)cin >> nb[i];

    //開始猜拳
    for (int i = 0; i < n; i++) {
        //這一輪小A出的是啥?
        int a = na[i % n1]; //n1為迴圈的長度,所以每一輪後,都需要mod n1
        //這一輪小B出的是啥?
        int b = nb[i % n2]; //n2為迴圈的長度,所以每一輪後,都需要mod n2

        s1 += g[a][b];      //根據事先推出的勝負平表,找出勝負平關係,累加到小A的得分中。
        s2 += g[b][a];      //根據事先推出的勝負平表,找出勝負平關係,累加到小A的得分中。
    }
    cout << s1 << " " << s2 << endl;
    return 0;
}

//P1328_2.cpp

#include <bits/stdc++.h>

using namespace std;
const int N = 210;

//本檔案是示例陣列下標從1開始如何計算
//陣列下標從1開始時,需要注意的問題: 前n-1個用MOD沒有問題,關鍵是n的倍數時,需要輸出n,而不是0,這個與下標從0開始時有區別!

//0 表示“剪刀”,1 表示“石頭”,2 表示“布”,3 表示“蜥蜴人”,4表示“斯波克”。
//看圖打表寫出對陣雙方的勝負平結果二維陣列
//這個勝負平表是關鍵
int g[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 n;      //表示進行N次猜拳
int n1;     //小A出拳的週期長度
int n2;     //小B出拳的週期長度
int na[N];  //表示小A出拳的規律
int nb[N];  //表示小B出拳的規律
int s1;     //小A贏幾次
int s2;     //小B贏幾次

int main() {
    //資料讀入
    cin >> n >> n1 >> n2;
    for (int i = 1; i <= n1; i++)cin >> na[i];
    for (int i = 1; i <= n2; i++)cin >> nb[i];

    //開始猜拳
    for (int i = 1; i <= n; i++) {
        //這一輪小A出的是啥?
        int a = na[i % n1 == 0 ? n1 : i % n1]; //n1為迴圈的長度,所以每一輪後,都需要mod n1
        //這一輪小B出的是啥?
        int b = nb[i % n2 == 0 ? n2 : i % n2]; //n2為迴圈的長度,所以每一輪後,都需要mod n2

        s1 += g[a][b];      //根據事先推出的勝負平表,找出勝負平關係,累加到小A的得分中。
        s2 += g[b][a];      //根據事先推出的勝負平表,找出勝負平關係,累加到小A的得分中。
    }
    cout << s1 << " " << s2 << endl;
    return 0;
}