题目分析:
- 暴力枚举
k
k
k,求出步骤
- 对于一段序列,贪心的遇到
0
0
0点,将自己到后面共
k
k
k个翻转,不是真的修改,而是打上标记
t
a
g
tag
tag表示翻转次数,若
t
a
g
+
a
[
i
]
是
奇
数
tag+a[i]是奇数
tag+a[i]是奇数,则已翻转好
- 如果最后剩下的序列小于
k
k
k,则不满足条件,返回最大值
Code:
#include <bits/stdc++.h>
using namespace std;
#define re register
#define maxn 5010
int n,a[maxn],b[maxn];
char s[5];
inline int read_() {
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
x=(x<<1)+(x<<3)+c-'0';
c=getchar();
}
return x*f;
}
inline int work_(int x) {
memset(b,0,sizeof(b));
int f=0,cnt=0;
for(int i=1;i<=n;++i) {
if( ! ( (a[i]+f) % 2 ) ) {
int pdc=i+x-1;
if(pdc>n) return (n+n);
++f;++cnt;
++b[pdc];
}
if(b[i]!=0) {
f-=b[i];
b[i]=0;
}
}
return cnt;
}
void readda_() {
n=read_();
for(re int i=1;i<=n;++i) {
scanf("%s",s);
if(s[0]=='B') a[i]=0;
else a[i]=1;
}
int AKIOI,k,mind=5555;
for(int i=1;i<=n;++i) {
AKIOI=work_(i);
if(AKIOI<mind) {
mind=AKIOI;
k=i;
}
}
printf("%d %d",k,mind);
}
int main() {
readda_();
return 0;
}