开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 14 天,点击查看活动详情
分析
提问为什么每日一题越来越水(bushi),不懂,为啥拿了个cf800分的题,我感觉蓝桥杯的题也不至于这么简单(bushi),这个题根本不要双指针,或者说双指针只能算其中一个很很很不起眼的方法,这题的最主要的方法和思想还是贪心和暴力,我用的也是一个很朴素的方法,我是先将字符读入然后跑一遍,用一个ans数组记录连续的x的段的数,cnt记录段的数量,然后遇到a[i]=='x'时候,我们就将cnt++,否则我们看当前cnt这个空间是否是0,如果是0,那么就continue,否则就将cnt++,代表进入了下一个空间,这样我们就可以找到所有的含连续1的段的1的个数,然后我们再遍历一下这些段,如果遇到ans[i]>=3,我们就要将答案res加上ans[i]-2;最后输出答案,就是挺裸的一个暴力题QAQ!就这样吧,看看need代码
代码
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <map>
#include <set>
#include <iomanip>
#include <cmath>
#include <unordered_map>
#include <stack>
#include <queue>
#define ll long long
#define lowbit(x) x&(-x)
using namespace std;
typedef pair<int,int> PII;
typedef pair<string,int> PSI;
typedef stack<int> stk;
int gcd(int x,int y){return y?gcd(y,x%y):x;}
ll qmi(ll x,ll y,int mod){
ll res=1;
while(y){if(y&1) res=res*x%mod;y>>=1;x=x*x%mod;}
return res;
}
const int N=110;
char a[N];
int ans[N];
int main(){
// ios::sync_with_stdio(0);
// cin.tie(0),cout.tie(0);
int n;
cin>>n;
scanf("%s",a+1);
int b[N];
for(int i=1;i<=n;i++){
if(a[i]=='x') b[i]=1;
else b[i]=0;
}
int cnt=1;
memset(ans,0,sizeof ans);
for(int i=1;i<=n;i++){
if(b[i]==1){
ans[cnt]++;
}
else{
if(ans[cnt]==0) continue;
cnt++;
}
}
int res=0;
for(int i=1;i<=cnt;i++){
if(ans[i]>=3){
res+=ans[i]-2;
}
//cout<<ans[i]<<"\n";
}
cout<<res<<"\n";
return 0;
}
然后就拜拜了,希望有帮助~