C - Crusaders Quest ZOJ - 枚举+栈模拟

  • C - Crusaders Quest

  •  ZOJ - 3983 
  • 题意:限定了九个字符,问最好情况下有几次三连碰。 
  • 思路: 先预处理把原有的三个连字符处理掉然后剩下的字母就肯定会肯定至少有一个字母不会产生三连击。
  • 只要枚举一下让哪个字母不产生连击即可,只要去掉一个剩下的就可以确定。枚举的情况中取一个最大值即可。
  • #include<iostream>
    #include<stack>
    using namespace std;
    #define maxn 100
    int t,ans,cnt,s1,tot,s2;
    string str,son;
    char stk[maxn],ss[maxn];
    int main()
    {
        ios::sync_with_stdio(false);
        cin>>t;
        while(t--)
        {
            ans=cnt=s1=s2=0;
            cin>>str;
            int len=str.size();
            for(int i=0; i<len; i++)
            {
                stk[++cnt]=str[i];
                if(cnt>2)
                {
                    if(stk[cnt]==stk[cnt-1]&&stk[cnt-1]==stk[cnt-2])
                    {
                        ans++;
                        cnt-=3;
                    }
                }
            }
            if(cnt>0)
            {
                s1=tot=0;
                for(int i=1; i<=cnt; i++)
                {
                    if(stk[i]=='a')continue;
                    ss[++tot]=stk[i];
                    if(tot>2)
                    {
                        if(ss[tot]==ss[tot-1]&&ss[tot-1]==ss[tot-2])
                        {
                            s1++;
                            tot-=3;
                        }
                    }
                }
                s2=max(s2,s1);
                s1=tot=0;
                for(int i=1; i<=cnt; i++)
                {
                    if(stk[i]=='g')continue;
                    ss[++tot]=stk[i];
                    if(tot>2)
                    {
                        if(ss[tot]==ss[tot-1]&&ss[tot-1]==ss[tot-2])
                        {
                            s1++;
                            tot-=3;
                        }
                    }
                }
                s2=max(s2,s1);
                s1=tot=0;
                for(int i=1; i<=cnt; i++)
                {
                    if(stk[i]=='o')continue;
                    ss[++tot]=stk[i];
                    if(tot>2)
                    {
                        if(ss[tot]==ss[tot-1]&&ss[tot-1]==ss[tot-2])
                        {
                            s1++;
                            tot-=3;
                        }
                    }
                }
                s2=max(s2,s1);
                if(s2==2)ans+=2;
                else ans++;
            }
            cout<<ans<<endl;
        }
        return 0;
    }

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值