2 条题解

  • 2
    @ 2023-2-18 11:11:46
    周期计算版(比较节省时间)
    using namespace std;
    int check(int a,int b)
    {
    if(a==b)
    return 0;
    if(a==0&&b==2||
    a==0&&b==3||
    a==1&&b==3||
    a==2&&b==4||
    a==3&&b==4||
    a==1&&b==0||
    a==2&&b==1||
    a==3&&b==2||
    a==4&&b==0||
    a==4&&b==1)
    return 1;
    return -1;
    }
    int n,a,b,ansA,ansB,z;//总共要出几个拳、小A出拳、小B出拳、小A得分、小B得分、周期(a*b)
    int A[4005],B[4005];//a出拳和b出拳(总)
    /*
    最大公因数
    int gcd(int a,int b){
    if(b==0)
    return a;
    return gcd(b,a%b);
    }
    最小公倍数
    int lcm(int a,int b){
    return a/gcd(a,b)*b;
    }
    */
    //以上以后会讲 ,但是为了你们能看懂就先不用了。
    int main()
    {
    cin>>n>>a>>b;
    z=lcm(a,b);//定义周期为最小公倍数(可能也不是最小,但我觉得这更容易)
    for(int i = 1;i<=a;i++)
    cin>>A[i];
    for(int i = 1;i<=b;i++)
    cin>>B[i];
    //一个周期内的出拳预处理出来
    for(int i=a+1;i<=z;i++)
    A[i]=A[i-a];
    for(int i=b+1;i<=z;i++)
    B[i]=B[i-b];
    //记录最终答案
    ansA = 0;
    ansB = 0;
    //整轮的处理
    int oneA=0; //一轮z次周期A的加分
    int oneB=0; //一轮z次的周期B的加分
    for(int i = 1;i<=z;i++)
    {
    if(check(A[i],B[i])==1)
    oneA++;
    if(check(A[i],B[i])==-1)	
    oneB++;
    }
    ansA+=(n/z)*oneA;
    ansB+=(n/z)*oneB;
    //剩下的处理 (多余的)
    for(int i = 1;i<=(n%z);i++)
    {
    if(check(A[i],B[i])==1)
    ansA++;
    if(check(A[i],B[i])==-1)	
    ansB++;
    }
    cout<<ansA<<" "<<ansB<<"\n"; //最重要的输出
    return 0;
    }
    

    • -2
      @ 2023-2-18 9:34:27

      11个判断

      #include<bits/stdc++.h>
      using namespace std;
      //如果小A的出拳为a,小B的出拳为b
      //返回这场比赛的结果:
      //1:小A胜
      //0:平局
      //-1:小B胜 
      int check(int a,int b){
      	if(a==b)
      		return 0;
      	if(a==0&&b==2||
      		a==0&&b==3||
      		a==1&&b==3||
      		a==2&&b==4||
      		a==3&&b==4||
      		a==1&&b==0||
      		a==2&&b==1||
      		a==3&&b==2||
      		a==4&&b==0||
      		a==4&&b==1)
      		return 1;
      	return -1; 
      } 
      int n,a,b,ansA,ansB;
      int A[205],B[205];
      int main()
      {
      	cin>>n>>a>>b;
      	for(int i=1;i<=a;i++)
      		cin>>A[i];
      	A[0]=A[a];
      	for(int i=1;i<=b;i++)
      		cin>>B[i];
      	B[0]=B[b];
      	ansA=0;//小A的最终得分 
      	ansB=0;//小B的最终得分
      	for(int i=1;i<=n;i++)
      	{
      		//小A获胜 
      		if(check(A[i%a],B[i%b])==1)
      		{
      			ansA+=1;
      			ansB+=0;
      		}
      		//小B获胜 
      		if(check(A[i%a],B[i%b])==-1)
      		{
      			ansA+=0;
      			ansB+=1; 
      		}	
      		//平局 
      		if(check(A[i%a],B[i%b])==0)
      		{
      			ansA+=0;
      			ansB+=0; 
      		}
      	} 
      	cout<<ansA<<" "<<ansB<<"\n";
      	return 0;
      }
      
      

      打表判断每场比赛结果

      #include<bits/stdc++.h>
      using namespace std;
      int f[5][5]={
      	0, -1, 1, 1, -1,
      	0, 0, -1, 1, -1,
      	0, 0, 0, -1, 1,
      	0, 0, 0, 0, 1,
      	0, 0, 0, 0, 0
      };
      int n,na,nb;
      int a[205],b[205]; 
      int main()
      {
      	cin>>n>>na>>nb;
      	for(int i=0;i<na;i++){
      		cin>>a[i];
      	}	 
      	for(int i=0;i<nb;i++){
      		cin>>b[i]; 
      	}
      	int suma,sumb;
      	suma=sumb=0;
      	for(int i=0;i<n;i++){
      		int aa=a[i%na];
      		int bb=b[i%nb];
      		if(aa>bb){
      			if(f[bb][aa]>0){
      				sumb++;
      			}else{
      				suma++;
      			}
      		}else if(aa<bb){
      			if(f[aa][bb]>0){
      				suma++;
      			}else{
      				sumb++;
      			}
      		}
      		//cout << i << " " << suma <<" "<<sumb<<endl;
      	} 
      	cout << suma << " " << sumb <<endl;
      	return 0;
      }
      
      • 1

      信息

      ID
      148
      时间
      1000ms
      内存
      128MiB
      难度
      4
      标签
      递交数
      48
      已通过
      24
      上传者