題面:
石頭剪刀布是常見的猜拳遊戲。石頭勝剪刀,剪刀勝布,布勝石頭。如果兩個人出拳一樣,則不分勝負。一天,小 A和小B正好在玩石頭剪刀布。已知他們的出拳都是有週期性規律的,比如:“石頭-布-石頭-剪刀-石頭-布-石頭-剪刀……”,就是以“石頭-布-石頭-剪刀”爲週期不斷循環的。請問,小 A和小B
比了 N 輪之後,誰贏的輪數多?輸入格式輸入包含三行。
第一行包含三個整數:N,NA,NB,分別表示比了 N輪,小 A出拳的週期長度,小 B 出拳的週期長度。0<N,NA,NB<100 0<N,NA,NB<100
第二行包含 NA個整數,表示小 A出拳的規律。第三行包含 NB個整數,表示小 B出拳的規律。
其中,0表示“石頭”,2表示“剪刀”,5表示“布”。相鄰兩個整數之間用單個空格隔開。輸出格式輸出一行,如果小 A贏的輪數多,輸出"A";如果小 B贏的輪數多,輸出"B";如果兩人打平,輸出 “draw”。提示對於測試數據,猜拳過程爲:
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贏的輪數多
sample intput:
10 3 4
0 2 5
0 5 0 2
sample output:
A
思路:
- 計NA*NB爲一輪,遍歷這一輪判斷一輪中AB勝負的次數。
- 將需要進行的次數與循環輪數進行計算,觀察需要計算多少輪,除掉正常輪數外還需要多少進行單獨計算
- 本題可以用最小公倍數代替NA*NB,能更好的縮小ab的數組大小
#include<iostream>
#include<stdio.h>
#include<cstring>
#include<cmath>
using namespace std;
int a[10001],b[10001];
int main()
{
int N,NA,NB;
int awin=0,bwin=0;
int atot=0,btot=0;
cin>>N>>NA>>NB;
int lun=NA*NB;
for(int i=0;i<NA;i++)
{
cin>>a[i];
}
for(int i=1;i<NB;i++)
{
for(int j=0;j<NA;j++)
a[j+i*NA]=a[j];
}
for(int i=0;i<NB;i++)
cin>>b[i];
for(int i=1;i<NA;i++)
{
for(int j=0;j<NB;j++)
b[j+i*NB]=b[j];
}
//cout<<b[2]-a[2]<<endl;
for(int i=0;i<lun;i++)
{
if(a[i]==b[i])//平局
continue;
else if(b[i]-a[i]==2||b[i]-a[i]==3||b[i]-a[i]==-5)//Awin
awin++;
else if(b[i]-a[i]==-2||b[i]-a[i]==-3||b[i]-a[i]==5)
bwin++;
}
if(N%lun==0)//剛好整除,就是輪的倍數
{
int temp=N/lun;
atot=temp*awin;
btot=temp*bwin;
}
else
{
int temp=N/lun;
int yu=N%lun;
atot=temp*awin;
btot=temp*bwin;
for(int i=0;i<yu;i++)
{
if(a[i]==b[i])//平局
continue;
else if(b[i]-a[i]==2||b[i]-a[i]==3||b[i]-a[i]==-5)//Awin
atot++;
else if(b[i]-a[i]==-2||b[i]-a[i]==-3||b[i]-a[i]==5)
btot++;
}
}
// cout<<atot<<" "<<btot<<endl;
if(atot>btot) cout<<"A"<<endl;
else if(atot<btot) cout<<"B"<<endl;
else cout<<"draw"<<endl;
return 0;
}