专栏文章

B. Target Practice 题解

个人记录参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miqz9ssb
此快照首次捕获于
2025/12/04 13:10
3 个月前
此快照最后确认于
2025/12/04 13:10
3 个月前
查看原文

Problem B.Target Practice题解

简化题意

输入大小为 10×1010×10 的字符, X 表示这个点射中, . 表示这个点未被射中,而计分规则是从外到内的每个环分数依次为 1,2,3,4,51,2,3,4,5 请计算出这次射击的总分。

思路1:

从外到内每一圈边界的计分方式其实可以看做:首先,对最外圈轮廓内部的所有 X 计一分,然后对此外圈内部的所有 X 计一分,以此类推。也就是说我们每次对大小为 10×10,8×8,6×6,4×4,2×210×10,8×8,6×6,4×4,2×2 的区间都计一分,我们发现这样的计分方式等价于第 ii 圈边界记 ii(1i5)(1≤i≤5)
那么代码就很好写了,我们对于第 ii 圈很容易计算出其包括的正方形的左上角与右下角的坐标值,按照先前所说的计分即可。
CPP
#include<bits/stdc++.h>
#define int long long 
using namespace std;
const int n=10;
int a[101][101];
signed main(){
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
    int T;cin>>T;
    while(T--){
        int ans=0;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                a[i][j]=0;//注意多测要清空否则上次的结果会干扰这次
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++){
                char c;cin>>c;
                if(c=='X') a[i][j]=1;//提前转化为数字1
            }
        for(int circle=1;circle<=5;circle++)//一共五个正方形
            for(int i=circle;i<=n-circle+1;i++)//当前正方形的起始与截止位置
                for(int j=circle;j<=n-circle+1;j++)
                    ans+=a[i][j];//计分
        cout<<ans<<"\n";
    }
    return 0;
}

思路2:

切比雪夫距离:一个点与原点之间的切比雪夫距离定义为其各坐标绝对值的最大值。即 D(x,y)=max{x,y}\operatorname{D}(x,y)=\max\{|x|,|y|\} 以中心点为原点,每个点的切比雪夫距离如图。 切比雪夫距离
那么我们将问题转化,我们将 10×1010×10 的图转化为横纵坐标都从 5-555 的一张图,图中的中心点 (0,0)(0,0) 为设置的虚点,那么每个点的贡献就是 6该点到虚点的切比雪夫距离6-\text{该点到虚点的切比雪夫距离} 最终统计答案即可。
代码如下:
CPP
void Main() {
    int ans = 0;
    for(int i = -5;i <= 5;i ++) {
        if(!i)continue;
        for(int j = -5;j <= 5;j ++){
            if(!j)continue;
            char t;
            cin>>t;
            if(t=='.')continue;
            ans+=6-max(abs(i),abs(j));
        }
    }
    cout<<ans<<'\n';
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...