AT_ttpc2015_g 题解

· · 题解

洛谷的 RMJ 总是 UKE,所以这一题是在 ATcoder 上做的,记录一,记录二。

思路一

首先字符串长度一定是 6 的倍数,然后判断是否只有 t、i、e、c、h 这五个字符,最后统计一下字符个数就行了。

代码(错误):

#include<iostream>
#include<string>
using namespace std;
int main()
{
    string a;
    int t=0,i=0,e=0,c=0,h=0;
    cin>>a;
    if(a.size()%6!=0){
        cout<<"No\n";
        return 0;
    }
    for(int s=0;s<a.size();s++){
        if(a[s]=='t') t++;
        else if(a[s]=='i') i++;
        else if(a[s]=='e') e++;
        else if(a[s]=='c') c++;
        else if(a[s]=='h') h++;
        else{
            cout<<"No\n";
            return 0;
        }
    }
    if(t==a.size()/6*2&&i==a.size()/6&&e==i&&c==e&&h==c) cout<<"Yes\n";
    else cout<<"No\n";
    return 0;
}

思路二

原因是因为少了判断字符的顺序,那么怎么判断字符的顺序呢?

  1. 如果 t 比 i 少,输出 No。

  2. 如果 t 比 e 少(由于 e 前面会有两个 t 所以 e 的个数要乘 2),输出 No。

  3. 如果 i 比 e 少,输出 No。

  4. 如果 e 比 c 少,输出 No。

  5. 如果 h 比 c 少,输出 No。

  6. 如果 t 比字符串 titech 的数量多并且 i 比 t 减去字符串 titech 的数量少,输出 No。

代码:

#include<iostream>
#include<string>
using namespace std;
int main()
{
    string a;
    int t=0,i=0,e=0,c=0,h=0;
    cin>>a;
    if(a.size()%6!=0){
        cout<<"No\n";
        return 0;
    }
    for(int s=0;s<a.size();s++){
        if(a[s]=='t') t++;
        else if(a[s]=='i') i++;
        else if(a[s]=='e') e++;
        else if(a[s]=='c') c++;
        else if(a[s]=='h') h++;
        else{
            cout<<"No\n";
            return 0;
        }
        if(t<i||t<e*2||i<e||e<c||c<h||(t>a.size()/6&&i<t-a.size()/6)){
            cout<<"No\n";
            return 0;
        }
    }
    if(t==a.size()/6*2&&i==a.size()/6&&e==i&&c==e&&h==c) cout<<"Yes\n";
    else cout<<"No\n";
    return 0;
}