ZOJ 3983[思维/构造]

这道题意为:给定一个仅包含'a', 'o', 'g'的字符串,当三个相同字符连续出现时,可以释放大技能并消除这些字符。目标是求解最大能释放多少次大技能。" 114089393,9938026,C# 中的模式匹配详解,"['C#编程', '模式匹配语法', '类型检查']

题目点击打开链接

题意

给一个字符串,其中只有a,o,g,当三个相同字符连在一起时释放大技能 
我们可以消除任意连续数量的字符  
问我们最大的释放大技能的数量是多少


输入
7
gggaaaooo
aaoogggoa
googgaaao
agogaooag
goooggaaa
gogogoaaa
gaogaogao

输出
3
3
2
1
3
2
1
先找aaa/ggg/ooo,若没有满足的则从a--o--g,开始先把删除a后的字符串进行查找ggg/ooo,在继续o(方法同前一句),继续g(同上),若刚开始就满足则直接输出ans(已满足条件ans==3),否则输出ans的加和后的值。
#include <bits/stdc++.h>

using namespace std;

string l,tmp;
int ans;

int cnt(string &tmp)
{
    int a=0,t=0;
    while(tmp.length()&&t<3){//找连续的三个字符
        t++;
        if(tmp.find("aaa",0)!=string::npos){//find 返回坐标 
            tmp.erase(tmp.find("aaa",0),3);
            a++;
        }
        else if(tmp.find("ggg",0)!=string::npos){
            tmp.erase(tmp.find("ggg",0),3);
            a++;
        }
        else if(tmp.find("ooo",0)!=string::npos){
            tmp.erase(tmp.find("ooo",0),3);
            a++;
        }
    }
//    printf("a=%d\n",a);
    return a;
}
int del(char c,string tmp)
{
    int f=0;
    int len = tmp.length();
    for(int i=0;i<len;){
        if(tmp[i]==c)tmp.erase(i,1),f++;
        else i++;
    }
    if(f){
        int p = cnt(tmp);
        if(p==0)return 1;// 如果没有找到更多的连续 说明可以继续消除返回1
        else return p;// 如果找到了 说明消除一个后 可以继续消除返回p
    }
    else return 0;
}
//aaggaogoo
int main (void) {
    int n;
    scanf("%d ",&n);

    while(n--){
       getline(cin,l);// cin>>l; 
        tmp = l;
        ans+=cnt(tmp);
//        printf("ans=%d\n",ans);
        string rep = tmp;
        if(ans!=3)
            ans+=max(max(del('a',rep),del('o',rep)),del('g',rep));
        printf("%d\n",ans);
        ans=0;
    }
    return 0;
}
#include<stdio.h>

#include<string.h>

#include<algorithm>

using namespace std;

char str[12], st[12], y[5] = {"0gao"};

int main()

{

    char ch;

    int t, i, j, flag;

    scanf("%d", &t);

    while(t--)

    {

        flag = 0;

        scanf("%s", str+1);

        for(i=1;i<=9;i++)

        {

            if(flag>=2 && str[i]==st[flag] && st[flag]==st[flag-1])

                flag -= 2;

            else

                st[++flag] = str[i];

        }

        if(flag==0)

            printf("3\n");

        else

        {

            for(j=1;j<=3;j++)

            {

                flag = 0;

                ch = y[j];

                for(i=1;i<=9;i++)

                {

                    if(str[i]==ch)

                        continue;

                    if(flag>=2 && str[i]==st[flag] && st[flag]==st[flag-1])

                        flag -= 2;

                    else

                        st[++flag] = str[i];

                }

                if(flag==0)

                {

                    printf("2\n");

                    break;

                }

            }


            if(j==4)

                printf("1\n");

        }

    }

    return 0;


}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值