1 条题解

  • 0
    @ 2026-10-18 18:37:42

    G4015 [GESP202503 四级] 荒地开垦 题解

    知识点:二维数组、贡献计数、枚举优化。

    解题思路

    对每格检查自身及上下左右五个位置的#数量:0个时计入原有可用格;恰1个时给唯一#所在位置记一份清除收益,最后加最大收益。

    为什么正确

    清掉一个#只能使原先仅被它阻碍的格子新变可用,其他格子状态不变,因此逐格贡献可相加。

    易错点

    计邻域时包括中心格;有两个及以上#阻碍的格子不能因清掉一个而贡献收益。

    复杂度

    时间O(nm),空间O(nm)。

    参考代码(C++17)

    #include<bits/stdc++.h>
    
    using namespace std;
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        int n,m;
        cin>>n>>m;
        vector<string>a(n);
        for(auto &s:a)cin>>s;
        vector<vector<int>>gain(n,vector<int>(m));
        int base=0;
        int dx[]= {
            0,1,-1,0,0
        }
        ,dy[]= {
            0,0,0,1,-1
        }
        ;
        for(int i=0;i<n;i++)for(int j=0;j<m;j++) {
            int c=0,x=-1,y=-1;
            for(int k=0;k<5;k++) {
                int u=i+dx[k],v=j+dy[k];
                if(u>=0&&u<n&&v>=0&&v<m&&a[u][v]=='#') {
                    c++;
                    x=u;
                    y=v;
                }
            }
            if(c==0)base++;
            else if(c==1)gain[x][y]++;
        }
        int best=0;
        for(auto row:gain)for(int x:row)best=max(best,x);
        cout<<base+best;
    }
    

    说明

    本题解为配套教学整理,非官方题解。复杂度按本页参考实现计算,题库使用10个自行生成的测试点。

    • 1

    信息

    ID
    711
    时间
    1000ms
    内存
    512MiB
    难度
    普及
    标签
    递交数
    1
    已通过
    1
    上传者