zoj 3983 Crusaders Quest(思维)

本文解析了CrusadersQuest游戏中特定字符串消除策略,旨在最大化触发超级技能的次数。通过消除连续三个相同字符的子串,文章详细阐述了如何根据剩余字符串长度判断最大技能触发次数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【题目】

Crusaders Quest

【题解】

题意:给定一个长度为9的字符串,只包含3个a、3个g、3个o,可任意消除,而消除长度为3的连续字符相同的子串可触发超级技能,输出最多可触发的超级技能次数。

思路:冷静分析一下,首先把连续三个字符相同的子串消除,处理后若是长度为0则输出3,长度为6则输出2,长度为9则可能为1或者2。长度为9时需判断是否任意第一个和第三个相同字符之间都存在两个不同字符,若存在,则输出1,否则输出2。

【代码】

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <stack>
#include <queue>
#include <algorithm>
#include <iostream>
#define mem(a) memset(a,0,sizeof(a))
#define go(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=1e5+5;
const int inf=0x3f3f3f3f;
typedef long long ll;
typedef unsigned long long ull;
main()
{
   int t;cin>>t;
   string a;
   while(t--)
   {
       cin>>a; int l=9;
       go(k,1,3)
       {
           go(i,0,l-3)
           {
               if(a[i]==a[i+1]&&a[i+1]==a[i+2])
               {
                   go(j,i,l-3) a[j]=a[j+3];
                   l-=3;break;
               }
           }
       }
       int ans;
       if(l==0) ans=3;
       else if(l==6) ans=2;
       else
       {
           ans=2;
           int f=0;
           char c[]="ago";
           go(k,1,3)
           {
               int c1=0,c2=0,c3=0;
               go(i,0,8)
               {
                   if(a[i]==c[k%3]) c1++;
                   else if(c1)
                   {
                       if(a[i]==c[(k+1)%3]) c2++;
                       else c3++;
                   }
                   if(c1==3)
                   {
                       if(c2&&c3)
                        f++;
                       break;
                   }
               }
           }
           if(f==3) ans=1;
       }
       cout<<ans<<endl;
   }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值