B3948 题解

· · 题解

Source & Knowledge

2024 年 3 月语言月赛,由洛谷网校入门计划/基础计划提供。

题目大意

给定一些多选题的答案和作答,加入你从第 x 题开始作答,判断你可以拿到多少分。

题目分析

首先,我们要考虑如何计算得分。

先判断没有作答的情况。

考虑将作答设为 1,答案设为 -1。将两个数组相加,那么 0 表示这个位置是正确的。

一个完全正确的答案数组一定全部为 0,如果数组存在多余的 -1,那么说明多涂。否则是部分正确的。

我们可以写出代码:

int check(int a[4],int b[4]){
    int c[4],sum=0;
    for(int i=0;i<4;i++)sum+=b[i];
    if(sum==0)return 0;
    for(int i=0;i<4;i++)c[i]=a[i]+b[i];
    for(int i=0;i<4;i++)
        if(c[i]==-1)return 0;
    for(int i=0;i<4;i++)
        if(c[i]==1)return 3;
    return 6;
}

然后我们枚举每个起点,按照题意模拟判断即可。

std::cin>>n;
for(int i=0;i<n;i++)
    for(int j=0;j<4;j++)std::cin>>a[i][j];
for(int i=0;i<n;i++)
    for(int j=0;j<4;j++)std::cin>>b[i][j],b[i][j]*=-1;
for(int i=0;i<n;i++){
    int ans=0;
    for(int j=0;j<n;j++)
        ans+=check(a[(i+j)%n],b[j]);
    std::cout<<ans<<" \n"[i==n-1];
}

视频讲解

完整代码见视频题解