蓝桥杯每日一题第五天

73 阅读1分钟

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

今天这个递推有点小意思,原来就是个小暴力(bushi),我也没想到我乱搞搞出来了,但是我依旧写的狮山代码,下面放个题目链接

3777. 砖块

分析

这题别被骗了,其实就是个很简单的暴力,但是我开始受到之前那个翻硬币那题的影响,写的是等于a[1]或者等于之前一项才要翻转,结果第一发就wa了,后来突然想到我的一个思路错了,就是我开始想如果全部能变成W,那就一定能变成B,我少考虑的奇数的情况,然后恍然大悟,不就是先判断能不能全变成W再看能不能变成B,如果都不可以输出-1,否则输出res+step数组的值,然后kkneed代码QAQ,狮山代码,不想再化简了,将就着看吧QAQ~

代码

#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=210;
int t,n,step[N];
char a[N],b[N];
inline void turn(int i){
    if(a[i]=='B') a[i]='W';
    else a[i]='B';
    if(a[i+1]=='B') a[i+1]='W';
    else a[i+1]='B';
}
inline void solve(){
    memset(step,0,sizeof step);
    cin>>n;
    int cnt=0;
    int res=0;
    scanf("%s",a+1);
    for(int i=1;i<=n;i++){
        b[i]=a[i];
    }
    bool ok=0;
    for(int i=1;i<n;i++){
        if(a[i]!='W'){
            turn(i);
            res++;
            step[++cnt]=i;
        }
    }
    for(int i=1;i<=n;i++){
        if(a[i]!='W'){
            ok=true;
            break;
        }
    }
    if(ok==false){
        printf("%d\n",res);
        if(res==0) return;
        for(int i=1;i<=cnt;i++){
            cout<<step[i]<<' ';
        }
        cout<<"\n";
        return;
    }
    for(int i=1;i<=n;i++) a[i]=b[i];
    res=0,cnt=0;
    memset(step,0,sizeof step);
    for(int i=1;i<n;i++){
        if(a[i]!='B'){
            turn(i);
            res++;
            step[++cnt]=i;
        }
    }
    for(int i=1;i<=n;i++){
        if(a[i]!='B'){
            ok=true;
            cout<<"-1\n";
            return;
        }
    }
    printf("%d\n",res);
    if(res==0) return;
    for(int i=1;i<=cnt;i++){
        cout<<step[i]<<' ';
    }
    cout<<"\n";
}
int main(){
    cin>>t;
    while(t--){
        solve();
    }
    return 0;
}

希望能帮助到大家,QAQ~