洛谷 9 月 CSP-J 组月赛 T1 [P8506]标题计数题解

标题计数题解~

背景

作者是一只普及组蒟蒻,这次比赛只拿了200分,普及组一等奖有点悬啊(悲

我的考场思路(仅供参考)

先把是一级标题和不是一级标题的拿出来分个类

是一级标题的

1.# This is a title//#号在开头并且后面有空格,最标准的一种

2.#    This is another title//#号后面有多个空格的

3.    # This is also a title//#号是除空格外第一个字符的

4.    #   You#can#add#more#sharps//#号后面的空格的后面还有多个#号

5.# #//#号后面的空格的后面只有单个#号

不是一级标题的

6.<h1>an HTML title</h1>//最不标准,#号都没有出现

7.#You should insert a space//#号后面没有空格

8.## This is a secondary title//两个#号连在一起的

9.aaaaa # This is not a title at all//#号前有非空格字符的

10. # //虽然#号后有空格,但是没有除空格外任意字符

我的思路来了:

大体思路:

因为我们找到一个#号光判断后面有没有空格是不够的,所以如果我们找到了#号后面有空格并且#号前面没有除空格外其他字符,只能筛掉6,7,8,9情况,但是10情况没有被判断。

所以当我们符合上述条件时,flag = true,如果找到了除空格外其他字符并且flag == true,就是完全符合条件的一个标题了。

//如果还没有思路,继续往下看看代码思路,如果有了思路,把它转换为代码思路吧!

代码思路:

遍历这个string的时候忽略空格,找到第一个#号,如果第一个#号后面紧跟着非空格字符就是不符合条件的(筛掉了情况7,8),跳出遍历。如果符合条件,flag = true,并且继续遍历。如果找到了其他字符并且flag == true,就说明#号后面除空格外有其他字符(筛掉情况10),如果flag == false,就说明#号还没出现除空格外字符就来了,不符合条件,跳出遍历。(筛掉6,9)

不是一级标题的全筛完啦!剩下的就都是一级标题了。

//看到这里觉得你行了,自己去写写看好吗?如果还是感觉有点模糊,请看正式题解

正式开始题解

//
//  main.cpp
//  U230287 标题计数
//
//  Created by SkyWave Sun on 2022/9/4.
//

#include <iostream>
using namespace std;
string str[11];
int main(int argc, const char * argv[]) {
    int n;
    scanf("%d\n",&n);//用scanf可以读掉换行,cin>>n;再getchar();
    for (int i = 0; i<n; ++i) {
        getline(cin, str[i]);//读入每一行
    }
    unsigned long long sum = 0;
    for (int i = 0; i<n; ++i) {
        unsigned short len = str[i].length();
        bool flag1 = false;
        bool flag2 = false;
        for (int j = 0; j<len; ++j) {
            if (str[i].at(j) == ' ') {
                //空的if写了干嘛?答:因为好看
            }else if (str[i].at(j) == '#') {
                if (flag1) {
                    flag2 = true;
                    break;
                }//flag1就是表示存在一种情况为除了空格外第一个字符是#并且#后面是空格,但是我们仍需要遍历整个字符串来判断#号后到底有没有字符,如果#号后都是空格是不满足题意的。# #(中间有空格)也是符合题意的,所以如果一行中再次出现#并且flag1 == true就说明这一行是一个一级标题。
                if (j == len - 1) break;//如果#在最末尾,下一行的判断会越界,而且这种情况也是不符合条件的
                if (str[i].at(j+1) == ' ')//这种就是前面说的如果#是第一个除空格外的字符且#的后面是空格就打上标记 flag1 = true;
                else break;//如果不是,那就不符合条件,不是一级标题
            }else {
                if (flag1) flag2 = true;
                break;//这里就表示flag == 1 并且一行中有除空格外其他字符就表示是一级标题
            }
        }
        if (flag1 && flag2) ++sum;//两种情况都符合才统计一种情况
    }
    printf("%llu\n",sum);
    return 0;
}

总结

这道题一定要细心细心再细心,把每种情况都考虑上了,样例全跑一遍并且确保自己不只是答案撞对了。

在学校一直以粗心为名的我最完这道题甚至把题目描述的markdown都复制过来跑了一遍,确认无误才敢交。

完结撒花! 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值