蓝桥杯每日一题第四天

45 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 14 天,点击查看活动详情

3768. 字符串删减

分析

提问为什么每日一题越来越水(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;
}

然后就拜拜了,希望有帮助~