1 条题解

  • 0
    @ 2025-8-24 22:29:28

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar wangbinfeng
    今天搞完大概就永远不会碰 OI 了,大家祝好!

    搬运于2025-08-24 22:29:28,当前版本为作者最后更新于2021-03-21 09:06:58,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    大家好,感谢大家阅读这篇题解!

    思路:

    首先,我们看到题,也许直觉认为是统计数字个数(数字是指 9x09\ge x \ge 0 的数 ,出题人语文水平有待提高)。

    but abc123abc2a3a1 只有三个数字,但答案是 44 ,可以得出应该求得是

    统计数的个数大家都会吧,具体在注释里。

    我看过其他的题解,大多都用 C++ 中的 string ,所以本题解使用读入一个字符判断一次。

    然后还有几个易错点,大家可以看更新日志(数据有点水,所以容易忽略细节,大家一定注意)。

    程序:

    //由于处理了2个hack且间隔时间较长,代码刻意加入了很多内容,可能使可读性变差,求谅解
    #include <bits/stdc++.h>
    using namespace std;
    bool num[1000];//存储是否出现过
    bool flag;//存有没有出现过0
    char c,c2;//由于没有用字符串,只能多开一个变量存上一个字符
    int ans,x;
    int main(){
    	for(c=getchar();c!=EOF;c=getchar()){
            if(c2=='0'&&(c<'0'||c>'9')&&x==0)flag=true;
            if(c>='0'&&c<='9')x=x*10+c-'0';//计算现在是多少
            else num[x]=true,x=0;//记录并归零
            c2=c;//记录上一个字符
        }
        if(c2>='0'&&c2<='9'&&num[x]==false)ans++;//注意要有特判
        if(c2=='0')ans++;
    	for(int i=1;i<1000;i++)ans+=num[i];
    	cout<<ans+flag;
    }
    
    

    最后,谢谢大家支持!

    更新日志:

    1. 4月27日:感谢 @cd8gsh 提醒,原因:数字有可能在最后,加入特判。
    2. 8月20日:感谢 @ZhuangnnnnE 提醒,原因:由于处理上一个 hack 触发了潜在 bug(即 0 这个特殊的数,它会与代表 目前没有存数字 的 0 重复),已修正。
    • 我没想到红题 hack 这么多,想大家谢罪,也感谢 2 位发现 hack 的同学!
    • 1

    信息

    ID
    6508
    时间
    1000ms
    内存
    500MiB
    难度
    1
    标签
    递交数
    0
    已通过
    0
    上传者