[Codeforces #608 div2]1272B Blocks
Description
There are nnn blocks arranged in a row and numbered from left to right, starting from one. Each block is either black or white.
You may perform the following operation zero or more times: choose two adjacent blocks and invert their colors (white block becomes black, and vice versa).
You want to find a sequence of operations, such that they make all the blocks having the same color. You don’t have to minimize the number of operations, but it should not exceed 3⋅n3⋅n3⋅n. If it is impossible to find such a sequence of operations, you need to report it.
Input
The first line contains one integer n(2≤n≤200)n(2≤n≤200)n(2≤n≤200) — the number of blocks.
The second line contains one string s consisting of n characters, each character is either “W” or “B”. If the i-th character is “W”, then the i-th block is white. If the i-th character is “B”, then the i-th block is black.
Output
If it is impossible to make all the blocks having the same color, print −1−1−1.
Otherwise, print an integer k(0≤k≤3⋅n)k(0≤k≤3⋅n)k(0≤k≤3⋅n) — the number of operations. Then print kkk integers p1,p2,…,pk(1≤pj≤n−1)p_1,p_2,…,p_k (1≤p_j≤n−1)p1,p2,…,pk(1≤pj≤n−1), where pjp_jpj is the position of the left block in the pair of blocks that should be affected by the jjj-th operation.
If there are multiple answers, print any of them.
题意
给定一串黑白文本,每次可以将其中相邻2个颜色翻转,求一个可行的操作序列使得操作后颜色相同。
如果不能找到输出-1
思路
一开始看到n<=200n<=200n<=200直接打了一发爆搜+记忆化,然后MLE炸到飞起……
正解是假定操作后全白,从头扫到尾一次,假定全黑,从头扫到尾一次,看看能否成功。
比如:我们要全白,而此时颜色是 黑白黑黑黑
可以将黑视作高台阶,白视作低台阶,然后一路推过去,最后能推平就可以了。

推平位置1后,往后找到位置2,推平位置2后,2 3都平了,再往后遍历找到位置4,推平位置4后,全部推平,合法。
因此操作序列就为:1 2 4
显然这样操作只会有2种结果:全平或者最后一个不平。
全黑全白两个都扫一遍就好了,复杂度O(n)O(n)O(n)
Code
#include <cstdio>
#include <cstring>
using namespace std;
int n,len;
char all[201];
char temp[201];
int path[201];
int tot;
bool checkblack()
{
memcpy(temp,all,sizeof(all));
tot = 0;
for(int i = 1;i<len;++i)
{
if(temp[i] == 'W')
{
temp[i] = 'B';
temp[i+1] = (temp[i+1] == 'W' ? 'B' : 'W');
path[++tot] = i;
}
}
return temp[len] == 'B';
}
bool checkwhite()
{
memcpy(temp,all,sizeof(all));
tot = 0;
for(int i = 1;i<len;++i)
{
if(temp[i] == 'B')
{
temp[i] = 'W';
temp[i+1] = (temp[i+1] == 'W' ? 'B' : 'W');
path[++tot] = i;
}
}
return temp[len] == 'W';
}
int main()
{
scanf("%d",&n);
scanf("%s",all+1);
len = strlen(all+1);
if(checkblack() || checkwhite())
{
printf("%d\n",tot);
for(int i =1 ;i<=tot;++i)
printf("%d ",path[i]);
}
else
printf("-1");
return 0;
}
[Codeforces #608 div2]1272B Blocks的更多相关文章
- [Codeforces #608 div2]1271D Portals
Description You play a strategic video game (yeah, we ran out of good problem legends). In this game ...
- [Codeforces #608 div2]1271C Shawarma Tent
Description The map of the capital of Berland can be viewed on the infinite coordinate plane. Each p ...
- [Codeforces #608 div2]1271A Suits
Description A new delivery of clothing has arrived today to the clothing store. This delivery consis ...
- Codeforces #180 div2 C Parity Game
// Codeforces #180 div2 C Parity Game // // 这个问题的意思被摄物体没有解释 // // 这个主题是如此的狠一点(对我来说,),不多说了这 // // 解决问 ...
- Codeforces #541 (Div2) - E. String Multiplication(动态规划)
Problem Codeforces #541 (Div2) - E. String Multiplication Time Limit: 2000 mSec Problem Descriptio ...
- Codeforces #541 (Div2) - F. Asya And Kittens(并查集+链表)
Problem Codeforces #541 (Div2) - F. Asya And Kittens Time Limit: 2000 mSec Problem Description Inp ...
- Codeforces #541 (Div2) - D. Gourmet choice(拓扑排序+并查集)
Problem Codeforces #541 (Div2) - D. Gourmet choice Time Limit: 2000 mSec Problem Description Input ...
- Codeforces #548 (Div2) - D.Steps to One(概率dp+数论)
Problem Codeforces #548 (Div2) - D.Steps to One Time Limit: 2000 mSec Problem Description Input Th ...
- 【Codeforces #312 div2 A】Lala Land and Apple Trees
# [Codeforces #312 div2 A]Lala Land and Apple Trees 首先,此题的大意是在一条坐标轴上,有\(n\)个点,每个点的权值为\(a_{i}\),第一次从原 ...
随机推荐
- JavaScript - jQuery注意点
jQuery统一了不同浏览器之间的DOM操作的差异 1. jQuery === $ // true 1.1 $(x) //将x转换为jQuery对象,便于调用jQuery提供的API 1.2 方便操作 ...
- 时间选择器UIDatePicker的使用
UIDatePicker的介绍 UIDatePicker这个类的对象让用户可以在多个车轮上选择日期和时间.iPhone手机上的‘时钟’应用程序中的时间与闹铃中便使用了该控件.使用这个控件时,如果你能配 ...
- ElementUI 中 el-table 获取当前选中行的index
第一种方法:将index放到row数据中 首先,给table加一个属性::row-class-name="tableRowClassName" 然后定义tableRowClassN ...
- SpringBoot+JWT+SpringSecurity+MybatisPlus实现Restful鉴权脚手架
若图片查看异常,请前往掘金查看:https://juejin.im/post/5d1dee34e51d4577790c1cf4 前言 JWT(json web token)的无状态鉴权方式,越来越流行 ...
- Spring学习(二)
IoC 1.Inverse of Control ,控制反转(控制权的翻转) 2.控制:对对象的创建.对对象的属性赋值等一系列操作本来应该是我们做的事情 Java Application : Date ...
- shell脚本中执行shell脚本
1.a.sh #!/bin/sh name="hello" ./b.sh $name 2.b.sh(这里把b.sh与a.sh放在同一目录下,便于演示) #!/bin/sh ech ...
- Linux命令:yum命令
YUM: Yellowdog Update Modifier,rpm的前端程序,可解决软件包相关依赖性,可在多个库之间定位软件包,up2date的替代工具 一.yum命令用法 yum repolist ...
- Android编程实现点击链接打开APP功能示例
本文实例讲述了Android编程实现点击链接打开APP功能.分享给大家供大家参考,具体如下: 在Android中点击链接打开APP是一个很常见的需求.例如,电商为用户发送优惠券之后经常会下发一条短信: ...
- 数学公式在 iOS 中的表示
1. 三角函数 double sin (double);正弦 double cos (double);余弦 double tan (double);正切 2 .反三角函数 double asi ...
- [CMake笔记] CMake向解决方案添加源文件兼头文件
回顾 在上一篇笔记里总结的时候说到,aux_source_directory这个函数在添加源码文件时,是不会把头文件添加进去的,这里就介经一下另外一个方法,也是我一直使用的. 添加文件*.cpp与*. ...