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;
    }
    

    信息

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