第六次练习部分题解
yzt的强迫症
题意
给你一个01组成的矩阵,你需要更改最少次数的01,使得这个01矩阵从4个方向来看都是一样的。问最少次数是多少。
做法
如上图所示,我们找到一个点的,那我们就可以找到4个方向对应的地方的
我们只需要对比每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);