Crusaders Quest

题目大意
每行给出九个字母,由3个a,g,o组成,每次可以消除相连的K个字母,K>=1。当K=3时是最好的消除方法。问最好的消除方法最多可以多少次。

解题思路:
首先从可以消除K=1个字母,就可以看出,结果(res)最少为1。
首先我们尽可能地将3个连着的消除,res如果等于3,那就输出3。
如果res=1,那就输出2。因为剩下的6个字母,最少可以组成三个相连,但是不能是两种3个相连,所以输出就是2.
res不可能等于2,因为若是2的话那剩下的三个一定一样,那就是res=3的情况。
除了上述情况,就只剩下res=0的情况了,这里我们的判断方法是:相同的字母中最远的两个之间的字母如果有其他两个种类的字母,那结果就是1。如果不是这样,那结果就是2。

AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <cmath>
#include <algorithm>
#include<bits/stdc++.h>
using namespace std;
const double N = 1e6+10;
const double pi = acos(-1.0);
const int INF = 0x3f3f3f3f;
const int MOD = 1000000007;
#define ll long long
#define CL(a,b) memset(a,b,sizeof(a))
#define MAXN 100010
int main()
{
	int t;
    while(cin >> t)
    {
        while(t--)
        {
            string s;
            cin >> s;
            string z;
            z = "";
            int l = 0;
            int res = 0;
            for(int i = 0 ; i < s.length() ; i++)
            {
                z = z + s[i];
                l = z.length();
                while(l>=3&&z[l-1]==z[l-2]&&z[l-2]==z[l-3])
                {
                    string zz;
                    zz = "";
                    res++;
                    for(int j = 0 ; j < l-3 ; j++)
                    {
                        zz = zz + z[j];
                    }
                    z = zz;
                    l = z.length();
                }
            }
            if(res == 3)
            {
                cout << res << endl;
            }
            else{
                if(res == 1)
                {
                    cout << "2" << endl;
                }
                else
                {
                    int l = 0;
                    int r = 0;
                    int f1 = 0;
                    int f2 = 0;
                    int f3 = 0;
                    int k = 0;
                    for(int i = 0 ; i < s.length() ; i++)
                    {
                        if(s[i]=='g'&&f1 == 0)
                        {
                            l = i;
                            f1 = 1;
                        }
                        if(s[i]=='g')
                        {
                            r = i;
                        }
                    }
                    for(int i = l+1 ; i < r ; i++)
                    {
                        if(s[i]=='a')
                        {
                            f2++;
                        }
                        if(s[i]=='o')
                        {
                            f3++;
                        }
                    }
                    if(f2!=0&&f3!=0)
                    {
                        k++;
                    }
                    l = 0;
                    r = 0;
                    f1 = 0;
                    f2 = 0;
                    f3 = 0;
                    for(int i = 0 ; i < s.length() ; i++)
                    {
                        if(s[i]=='a'&&f1 == 0)
                        {
                            l = i;
                            f1 = 1;
                        }
                        if(s[i]=='a')
                        {
                            r = i;
                        }
                    }
                    for(int i = l+1 ; i < r ; i++)
                    {
                        if(s[i]=='g')
                        {
                            f2++;
                        }
                        if(s[i]=='o')
                        {
                            f3++;
                        }
                    }
                    if(f2!=0&&f3!=0)
                    {
                        k++;
                    }
                    l = 0;
                    r = 0;
                    f1 = 0;
                    f2 = 0;
                    f3 = 0;
                    for(int i = 0 ; i < s.length() ; i++)
                    {
                        if(s[i]=='o'&&f1 == 0)
                        {
                            l = i;
                            f1 = 1;
                        }
                        if(s[i]=='o')
                        {
                            r = i;
                        }
                    }
                    for(int i = l+1 ; i < r ; i++)
                    {
                        if(s[i]=='g')
                        {
                            f2++;
                        }
                        if(s[i]=='a')
                        {
                            f3++;
                        }
                    }
                    if(f2!=0&&f3!=0)
                    {
                        k++;
                    }
                    if(k==3)
                    {
                        cout << "1" << endl;
                    }
                    else{
                        cout << "2" << endl;
                    }
                }
            }
        }
    }
    return 0;
 } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值