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


// Problem: P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1328#submit
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// User: Pannnn

#include 

using namespace std;

int main() {
    // 使用二维数组存储a对b猜拳各种情况下的结果
    int res[5][5] = {
        {0, -1, 1, 1, -1},
        {1, 0, -1, 1, -1},
        {-1, 1, 0, -1, 1},
        {-1, -1, 1, 0, 1},
        {1, 1, -1, -1, 0}
    };
    
    int n, na, nb;
    cin >> n >> na >> nb;
    
    vector a(na);
    vector b(nb);
    for (int i = 0; i < na; ++i) {
        cin >> a[i];
    }
    
    for (int i = 0; i < nb; ++i) {
        cin >> b[i];
    }
    
    int cntA = 0, cntB = 0;
    for (int i = 0; i < n; ++i) {
        // a[i % na]是本次a出拳,出拳序列为循环,可以用取余拿到
        if (res[a[i % na]][b[i % nb]] == 1) {
            ++cntA;
        } else if (res[a[i % na]][b[i % nb]] == -1) {
            ++cntB;
        }
    }
    cout << cntA << " " << cntB << endl;
    return 0;
}
/*
 错误的写法:
1. 
vector a(n);
for (int i = 0; i < na; ++i) { cin >> a[i]; }
可能n比na小,越界。

2.
vector a(n);
for (int i = 0; i < na && i < n; ++i) { cin >> a[i]; }
避免了越界,但n比na小,有数据还在流内,读到下一个vector中。
*/

相关