分析:
一、赢输平三种情况
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 "); if (suma<sumb)printf("B "); if(suma==sumb)printf("draw "); return 0; }
方法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 "); if (suma<sumb)printf("B "); if(suma==sumb)printf("draw "); return 0; }