acwing3777砖块 CF1271B

原题链接
题目
来源:CF1271B

最初看到答案不唯一,就知道可以暴力去做,最初就打算锁定第一个颜色,根据地一个颜色来确定整行砖块的最终颜色,然后不断地向后比较,遇到不同的就和后面的一起反转,直到最后检查是否相同。
在推样例检查BUG的时候,发现这样不严谨,因为有可能如果不能够让其全部变成黑色,也有可能全部变成白色,后来发现了当最初的颜色个数为偶数时,可以设定为整行的最终颜色,如果最初的颜色个数为奇数,则不可能实现整行全部为该颜色。
所以选择两种颜色都尝试一边,如果都不行就输出-1
代码看了闫总的,觉得很好看,仿照的闫总。闫总就是暴力尝试的,没有讨论颜色个数的奇数偶数问题,假设该行为黑色,然后开始暴力修改。

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef pair<int,int>pii;

const int maxn=2e5+5;
const int inf=0x3f3f3f3f;
int n;
void update(char& c)//转换字母
{
    if (c == 'W')
        c = 'B';
    else
        c = 'W';
}
bool check(string s,char c)
{
    vector<int>res;//存放答案
    for (int i= 0;i<n-1;i++ )
    {
        if(s[i]!=c)
        {   res.push_back(i+1);
            update(s[i]);
            update(s[i + 1]);
        }
    }
    if (s[n-1]!= s[0])//如果转化完成之后,首尾不相同
        return false;

    cout << res.size() << endl;
    for (auto x: res)
        cout <<x<< ' ';
    if (res.size()>0)
        cout<<endl;
    return true;
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        cin>>n;
        string s;
        cin>>s;
        if (!check(s, 'W') && !check(s, 'B'))
            puts("-1");
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值