計蒜客T1096-猜拳遊戲預測勝負

題面:

石頭剪刀布是常見的猜拳遊戲。石頭勝剪刀,剪刀勝布,布勝石頭。如果兩個人出拳一樣,則不分勝負。一天,小 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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章