洛谷--P1321 单词覆盖还原


这道题乍一看情况非常多种,逻辑判断似乎十分复杂,但是其实我们分类清晰的话,问题就可以迎刃而解。
我们仔细思考一下,出现boy的次数应该怎么计算?其实无非就是三种情况(从大方向上判断)
1.b开头的情况---b,bo,boy;这三种情况。
2.o开头的情况---o,oy,这两种情况(但是不能包含boy这种情况,因为boy这种情况再上面已经计算过一次了)
3.y开头的情况---y,就一种情况,对应的代码如下:

点击查看代码
         int boy=0; 
        if (s[i] == 'b') boy++;    
        if(s[i]=='o'&&(i-1>=0&&s[i-1]!='b')) boy++;  
        if (s[i] == 'y' && (i - 1 >= 0 && s[i - 1] != 'o')) boy++;
类似地... girl的代码同理:
点击查看代码
        int girl=0;
        if (s[i] == 'g') girl++;     
        if (s[i] == 'i' && (i - 1 >= 0 && s[i - 1] != 'g')) girl++;  
        if (s[i] == 'r' && (i - 1 >= 0 && s[i - 1] != 'i')) girl++;
        if (s[i] == 'l' && (i - 1 >= 0 && s[i - 1] != 'r')) girl++;
题解的具体代码如下:
点击查看代码
#include <iostream>
using namespace std;

int main() {
    //输入字符串
    string s;
    cin >> s;
    //定义boy和girl,用于记录boy和girl出现的次数
    int boy = 0,girl=0;

    for (int i = 0; i < s.length(); i++) {

        if (s[i] == 'b') boy++;
        if (s[i] == 'o' && (i - 1 >= 0 && s[i - 1] != 'b')) boy++;
        if (s[i] == 'y' && (i - 1 >= 0 && s[i - 1] != 'o')) boy++;


        if (s[i] == 'g') girl++;
        if (s[i] == 'i' && (i - 1 >= 0 && s[i - 1] != 'g')) girl++;
        if (s[i] == 'r' && (i - 1 >= 0 && s[i - 1] != 'i')) girl++;
        if (s[i] == 'l' && (i - 1 >= 0 && s[i - 1] != 'r')) girl++;
    }

    cout << boy << endl;
    cout << girl << endl;

    return 0;
}
通过这道题,我想表达的是:在有些看似逻辑判断十分复杂的逻辑条件中,通过仔细分类,我们也能通过比较清晰的逻辑条件来分类各种可能会出现的情况。
posted @ 2024-07-09 00:23  Tomorrowland_D  阅读(112)  评论(0)    收藏  举报