分析:

一、赢输平三种情况

0表示“石头”,2表示“剪刀”,5表示“布

赢t:

0-2=-2

2-5=-3

5-0=5

输t:

2-0=2

5-2=3

0-5=-5

平t:两边的值相等

 二、计算出拳情况,然后一一对比

 

对于测试数据,猜拳过程为:
A:0 2 5 0 2 5 0 2 5 0
B:0 5 0 2 0 5 0 2 0 5
A赢了4轮,B赢了2轮,双方打平4轮,所以A赢的轮数多。

方法1:使用数组存储双方所有的出拳情况,然后一一对比即可

 

以规律为na为例

 int t=0;  //初值为0  for (int i=1;i<=n;i++){   t++;   a[i]=ya[t];   if (i%na==0)t=0 ; //如果i是na的倍数,t恢复初值0  }

#include<cstdio>
int a[110],b[110],ya[110],yb[110];
int main(){
    int n,na,nb;
    scanf("%d%d%d",&n,&na,&nb);
    int temp;
    for (int i=1;i<=na;i++)
        scanf("%d",&ya[i]);
    for (int i=1;i<=nb;i++)
        scanf("%d",&yb[i]);
    int t=0;
    for (int i=1;i<=n;i++){
        t++;
        a[i]=ya[t];
        if (i%na==0)t=0 ;
    } 
    t=0;
    for (int i=1;i<=n;i++){
        t++;
        b[i]=yb[t]; 
        if (i%nb==0)t=0 ;
    } 
    int suma=0,sumb=0;
    for (int i=1;i<=n;i++){
        if (a[i]-b[i]==-2||a[i]-b[i]==-3 ||a[i]-b[i]==5)suma++;
        if (a[i]-b[i]==-5||a[i]-b[i]==3||a[i]-b[i]==2) sumb++;
    }
    if (suma>sumb)printf("A\n");
    if (suma<sumb)printf("B\n");
    if(suma==sumb)printf("draw\n");
    return 0;
}
    
View Code

 方法2:边出拳边比较。这样可以节约1个数组。

#include<cstdio>
int a[110],b[110],ya[110],yb[110];
int main(){
    int n,na,nb;
    scanf("%d%d%d",&n,&na,&nb);
    int temp;
    for (int i=1;i<=na;i++)
        scanf("%d",&ya[i]);
    for (int i=1;i<=nb;i++)
        scanf("%d",&yb[i]);
    int suma=0,sumb=0,t0=0,t1=0;
    for (int i=1;i<=n;i++){
        t0++;t1++;
        if (ya[t0]-yb[t1]==-2||ya[t0]-yb[t1]==-3 ||ya[t0]-yb[t1]==5)suma++;
        if (ya[t0]-yb[t1]==-5||ya[t0]-yb[t1]==3||ya[t0]-yb[t1]==2) sumb++;
        if (i%na==0) t0=0 ;
        if (i%nb==0) t1=0 ;
    }

    if (suma>sumb)printf("A\n");
    if (suma<sumb)printf("B\n");
    if(suma==sumb)printf("draw\n");
    return 0;
}
View Code