第六次练习部分题解

yzt的强迫症

题意

给你一个01组成的矩阵,你需要更改最少次数的01,使得这个01矩阵从4个方向来看都是一样的。问最少次数是多少。

做法

alt

如上图所示,我们找到一个点的i,ji,j,那我们就可以找到4个方向对应的地方的i,ji,j

我们只需要对比每4个点的0多还是1多,以此来算出最后最少改变次数。

关键代码

int ans = 0;
for(i = 1; i <= (n + 1) / 2; i ++)//i和j只有一个遍历到n/2上取整,防止奇数情况下部分没遍历到或者重复遍历
{
    for(j = 1; j <= n / 2; j ++)
    {
        int sum = 0;
        sum += a[i][j] + a[j][n - i + 1] + a[n - j + 1][i] + a[n - i + 1][n - j + 1];
        if(sum > 4 - sum) ans += 4 - sum;
        else ans += sum; 
    }
}
printf("%d\n",ans);

yzt打4K

题意

对于n排下落的一组字符,有0~4个_,其余的全是.,给你n个十进制数,把它拆成一个4位的2进制数,然后与每一排的_.对应,计算准确率的方式如下: 在当前拍按上对应的键子,对应的键子消失,算100%准确率。 如果提前一拍按到对应的键子,提前按到的键子消失,算50%准确率。 如果上一拍的某个键子没有按过,则这个键子消失,算0%准确率。 铺面的整体准确率为 所有键子的准确率和/键子个数。

做法

简单模拟,从下往上遍历,拆解十进制的数,然后一一对比。

关键代码

for(i = n; i >= 1; i --)
{
    int x;
    scanf("%d",&x);
    for(j = 4; j >= 1; j --)
    {
        b[j] = x % 2;
        x /= 2;
    }
    for(j = 1; j <= 4; j ++)
    {
        if(b[j] == 1 && a[i][j] == '_')
        {
            sum0 += 1.0;
            sum1 += 1.0;
        }
        else if(b[j] == 1 && a[i-1][j] == '_' && a[i][j] == '.')
        {
            sum0 += 1.0;
            sum1 += 0.5;
            a[i-1][j] = '.';
        }
        else if(a[i][j] == '_')
        {
            sum0 += 1.0;
        }
    }
}
printf("%.6lf\n",sum1 / sum0);
全部评论

相关推荐

评论
点赞
收藏
分享
牛客网
牛客企业服务