-
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; }
C - Crusaders Quest ZOJ - 枚举+栈模拟
最新推荐文章于 2018-12-05 20:28:32 发布