B.TMT Document (思维分析)

题目大意:

/
t组数据,每组给你一个长为n的字符串,
字符串由T和M组成,问你是否存在TMT(不是严格的紧挨)
存在,如果由则输出YES 否者输出NO

/

先分析我的代码(改4.0之后的代码):

 int t;
    cin>>t;
    while(t -- )
    {
        int n ;
        cin>>n;
        int sum =0;
        getchar();
        int pos  = 0;
        int sum2 = 0;
        int sum1 = 0;

这里我先处理了一下最后一个M的位置,同时还记录了M的个数
这样子就可以判断M前面的T是否和M的数量一样了

for(int i=0; i<n; i++)
{
    scanf("%c",&s[i]);
    if(s[i]=='M')
    {
        pos = i;
        sum2++;
    }
}

这里又判断了最后一个M之后的所有T
(这里就开始出错了,因为如TTMTMT)

for(int i=pos; i<n; i++)
{
    if(s[i]=='T')
    {
        sum1++;///我这里判断了 最后一个M前面的T
    }
}
if(sum1!=sum2) 如果sum1!=sum2  这里其实就错了 最后一个M之后的T  和 之前的T相比
    cout<<"NO"<<endl;
    else
    {
        int ft = 0;
        int fb = 0;
        int st = 0;
        bool flag = true;

        for(int i=0; i<n; i++)
        {
            if(s[i]=='T')
                ft++;  如果有T那么ft++
            if(s[i]=='M')
            {
                st++;如果有M st++ 其实这里都乱套了
                ft--;
                sum-=2;
                if(ft<0)
                {
                    cout<<"NO"<<endl;
                    flag  =false;
                    break;
                }
            }
            if(i==n-1&&s[i]=='M'&&ft)
            {
                cout<<"NO"<<endl;
                flag  =false;
                break;
            }
        }

        if(flag)
        {

            if(st!=ft)
                cout<<"NO"<<endl;
            else
                cout<<"YES"<<endl;

        }

    }
}

我们来看正解

先考虑,其实每一个M前面的T的数量 只需要>sum(M) 就行
然后M后面如果有T 那么直接减就完了,这样子就保证了最近最优

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n ;
        string s;
        cin>>n;
        cin>>s;

        int t= 0,m=0,cnt = 0;
        bool flag  = true;
        int len  =s.size();
        for(int i=0;i<len;i++)
        {
            if(s[i] =='T')
            {
                t++;
                if(cnt)
                    cnt--;
                    这样子就保证了 M基本都是和他最近的一个T 消除的
                    同时也就保证了 T 是不会乱来 的
            }
            else
            {
                m++;
                cnt++;
                if(m>t)如果m大于了 m前面的T的个数
                    flag =false;
            }
        }
        如果m还有剩余 或者 t还有剩余
        if(t!=m*2||cnt) flag =false;
        if(flag) cout<<"YES"<<endl;
        else
            cout<<"NO"<<endl;

    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值