1 条题解

  • 0
    @ 2025-8-24 21:41:55

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar RocksonLee
    **

    搬运于2025-08-24 21:41:55,当前版本为作者最后更新于2019-01-29 14:04:13,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    这是本蒟蒻第一次发题解,有点悬……

    这道题采用暴力通过,不过坑点有点多,因为这样,才能成为绿题(刷的时候还被黄了)。

    这道题并不是很难,题目的点都得好好瞧瞧,有点烦……

    先是找最长的全“0”字段

        int i1,i2,t;
        bool ok;
        for (i1=0,t=0;i1<8;i1++)
        {
            ok=true;
            for (i2=0;i2<4;i2++)
            {
                if (a[i1*5+i2]!='0')
                {
                    ok=false;    //如果有一个非0字符则跳出循环 
                    break;
                }
            }
            if (ok) 
            {
            	t++;          //计数器 
                if (t>maxn) 
                {
                    maxn=t;
                    maxi=i1;
                }
            }
            else t=0;           
        }
        if (maxn==1) maxi=-1;
        maxi=maxi-maxn+1;
    

    处理时需要注意windows和macos规则不同,当全“0”字段只有一个,用“::”就没法AC了,应该像处理剩下的“0”那样处理。

    处理剩下的“0”

    while (a[i1*5+i2]=='0'&&i2<3) i2++;
    

    有点暴力,直接无视跳过前导零和余下全“0”字段。

    本人AC代码

    #include <bits/stdc++.h>   //传说神奇的万能头文件
    using namespace std;
    char a[39];
    int maxi=-1,maxn=1;
    void find ()          //寻找最长"0000"字段函数 
    {
        int i1,i2,t;
        bool ok;
        for (i1=0,t=0;i1<8;i1++)
        {
            ok=true;
            for (i2=0;i2<4;i2++)
            {
                if (a[i1*5+i2]!='0')
                {
                    ok=false;    //如果有一个非0字符则跳出循环 
                    break;
                }
            }
            if (ok) 
            {
            	t++;          //计数器 
                if (t>maxn) 
                {
                    maxn=t;
                    maxi=i1;
                }
            }
            else t=0;           
        }
        if (maxn==1) maxi=-1;    //windows和mac os压缩规则不一致 
        maxi=maxi-maxn+1;
    } 
    int main ()
    {
        scanf("%s",a);
        find();
        int i1,i2;
        for (i1=0;i1<8;i1++)
        {
            if (maxi==i1)        //将最长字段压缩成“::” 
            {
                cout<<":";
                if (i1==0) cout<<":";
                i1=i1+maxn;
                if (i1>7) break;
            }
            i2=0;
            while (a[i1*5+i2]=='0'&&i2<3) i2++;  //处理全“0”字段
            for (;i2<4;i2++)
            { 
                cout<<a[i1*5+i2];
            }
            if (i2==4&&i1!=7) cout<<":";  //最后一个字段无需“:” 
        }
        return 0;
    }
    
    • 1

    信息

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