1 条题解

  • 0
    @ 2025-8-24 21:22:15

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Sqrt_tyz
    AFO

    搬运于2025-08-24 21:22:14,当前版本为作者最后更新于2017-10-20 21:55:38,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    很奇怪这道题竟然在大牛分站里头

    个人认为入门普及难度吧

    1.只需要从上、前、侧三个方面来看,将和×2即为答案。

    2.但是要注意凹槽,20分一般就是没判断凹槽。

    3.判断方法

    (1)上面来看:直接把输入扫一遍,>0则ans++

    (2)前面来看:每一列分为一组,第一个直接加上,后面的加上与前一个的差(若小于就不加啦)

    e.g.若这一列为3545,则ans=3+2+0+1=6.

    (3)侧面来看:每一行分为一组,第一个直接加上,后面的加上与前一个的差(括号内容同上)

    e.g.若这一行为2341,则ans=2+1+1+0=4.

    ※这样做即可即可解决凹槽的问题啦= =

    贴代码:

    #include<iostream>
    #include<cstdio>
    using namespace std;
    int map[1001][1001];
    char input;
    int ans_u,ans_f,ans_r,n,m;
    int main()
    {
        cin>>n>>m;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
            {
                cin>>input;
                map[i][j]=input-'0';
            }
        //上面
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
            {
                if(map[i][j]>0) ans_u+=1;
            }
        //正面
        for(int j=1;j<=m;j++)
        {
            ans_f+=map[1][j]; //第一个先加上
            for(int i=2;i<=n;i++)
            {
                if(map[i][j]>map[i-1][j])
                    ans_f+=(map[i][j]-map[i-1][j]); //后面的加上与前一个的差
            }
        }
        //侧面
        for(int i=1;i<=n;i++)
        {
            ans_f+=map[i][1]; //第一个先加上
            for(int j=2;j<=m;j++)
            {
                if(map[i][j]>map[i][j-1])
                    ans_r+=(map[i][j]-map[i][j-1]); //后面的加上与前一个的差
            }
        }
        cout<<(ans_u+ans_f+ans_r)*2;
        return 0;
    }
    

    新人写题解,不喜勿喷。。

    • 1

    信息

    ID
    188
    时间
    1000ms
    内存
    125MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者