题目点击打开链接
题意
给一个字符串,其中只有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;
}
这道题意为:给定一个仅包含'a', 'o', 'g'的字符串,当三个相同字符连续出现时,可以释放大技能并消除这些字符。目标是求解最大能释放多少次大技能。"
114089393,9938026,C# 中的模式匹配详解,"['C#编程', '模式匹配语法', '类型检查']
2262

被折叠的 条评论
为什么被折叠?



