石头剪刀布

GitHub跳转原题关系图返回列表

用取模循环访问两人的出拳周期,并按胜负映射累计胜场。

OJ: noi_openjudge

题目 ID: ch0106-08

难度:入门

标签:模拟数组循环python

日期: 2026-07-30 23:01

题意

两人按各自周期出石头、剪刀、布,比赛 NN 轮后比较谁获胜轮数更多。

思路

ii 轮的出拳下标分别为 i % a_lengthi % b_length。字典 wins_against 记录每种拳能战胜的拳,比较映射结果即可计数。

代码

Python代码

python
round_count, a_length, b_length = map(int, input().split())
a_pattern = list(map(int, input().split()))
b_pattern = list(map(int, input().split()))

# 每种拳能战胜的拳:石头 0 胜剪刀 2,剪刀 2 胜布 5,布 5 胜石头 0。
wins_against = {0: 2, 2: 5, 5: 0}
a_wins = sum(wins_against[a_pattern[i % a_length]] == b_pattern[i % b_length] for i in range(round_count))
b_wins = sum(wins_against[b_pattern[i % b_length]] == a_pattern[i % a_length] for i in range(round_count))

if a_wins > b_wins:
    print("A")
elif a_wins < b_wins:
    print("B")
else:
    print("draw")

C++代码

cpp
#include <cstdio>

int n,na,nb;
int a[105],b[105];

int main(){
    scanf("%d%d%d",&n,&na,&nb);
    int i,j;
    for (i=1;i<=na;i++){
        scanf("%d",&a[i]);
    }

    int idx = 1;
    for(i=na+1;i<=n;i++){
        a[i] = a[idx];
        idx++;
    }
    for (i=1;i<=nb;i++){
        scanf("%d",&b[i]);
    }

    idx = 1;
    for(i=nb+1;i<=n;i++){
        b[i] = b[idx];
        idx++;
    }
    int win_a = 0,win_b =0;
    for(i=1;i<=n;i++){
        if( (a[i] == 0 && b[i] == 2) || (a[i] == 2 && b[i] == 5) || (a[i] == 5 && b[i] == 0 ))
            win_a++;
        else if( (b[i] == 0 && a[i] == 2) || (b[i] == 2 && a[i] == 5) || (b[i] == 5 && a[i] == 0 ))
            win_b++;
    }
    if( win_a == win_b)
        printf("draw");
    else if( win_a > win_b)
        printf("A");
    else 
        printf("B");
    return 0;
}

复杂度

时间复杂度为 O(N)O(N),除两个周期外额外空间复杂度为 O(1)O(1)

总结

周期性序列访问的核心是下标对周期长度取模。