《蓝桥杯每日一题》3777. 砖块 / acwing

n 个砖块排成一排,从左到右编号依次为 1∼n1。

每个砖块要么是黑色的,要么是白色的。

现在你可以进行以下操作若干次(可以是 00 次):

选择两个相邻的砖块,反转它们的颜色。(黑变白,白变黑)

你的目标是通过不超过 3n 次操作,将所有砖块的颜色变得一致。

输入格式

第一行包含整数 T,表示共有 T组测试数据。

每组数据第一行包含一个整数 n

第二行包含一个长度为 n 的字符串 s。其中的每个字符都是 WB,如果第 i� 个字符是 W,则表示第 i号砖块是白色的,如果第 i 个字符是 B,则表示第 i 个砖块是黑色的。

输出格式

每组数据,如果无解则输出一行 −1−1。

否则,首先输出一行 k,表示需要的操作次数。

如果 k>0,则还需再输出一行 k 个整数,p1,p2,…,pk1,2,…,。其中 pi�� 表示第 i� 次操作,选中的砖块为 pi�� 和 pi+1+1 号砖块。

如果方案不唯一,则输出任意合理方案即可。

数据范围

1≤T≤101≤≤10,

2≤n≤2002≤≤200。

输入样例:
4
8
BWWWWWWB
4
BWBB
5
WWWWW
3
BWB
输出样例:
3
6 2 4
-1
0
2
2 1
思路(y总):

题意:通过翻转,将所有砖块的颜色变得一致。

那么我们可以假定,最后全部反转成白色或者黑色,我们只需要比较每个砖块与我们的目标是否一致,假如,我们想让最后的颜色统一为白色,如果当前的砖块的颜色不是白色,我们便反转一次。例如:下标为0的砖块(也就是第一个)是黑色,但我们目标是白色,那么便翻转一次,而且每一个砖块只能翻转一次,只要翻转就不能再翻了,这样一来,我们现在只用管剩下的n-1个,同理,我们再看下标为1的砖块是否为黑色,如果不是就翻转一次.........一直反转到最后一个,当全部翻转之后,我们判断一下最后一个砖块是否为目标颜色,如果不是则证明不能反转为此颜色,我们再来判断另一种,另一种同理。(还是比较好理解的吧)

源码:

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 222;
int T,n;
string str;
void turn(char &c)
{
    if(c!='W')
    c = 'W';
    else
    c ='B';
}
bool check(char c)
{
    vector<int>ans;
    string s;
    s = str;
    for(int i = 0;i+1<n;i++)
    {
        if(s[i]!=c)
        {
            turn(s[i]);
            turn(s[i+1]);
            ans.push_back(i);
        }
    }
    if(s.back()!=c) 
    return false;
    cout<<ans.size()<<endl;
    for(int x: ans)
    cout<< x + 1<<" ";//注意位置是下标加1
    if(ans.size())cout<<endl;
    return true;
}
int main()
{
    cin>>T;
    while(T--)
    {
        cin>>n>>str;
        if(!check('W')&&!check('B'))
            cout<<"-1"<<endl;
    }
    
    return 0;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值