黑白子
题目描述
信息社的同学最近迷上了五子棋,小A同学把一些棋子排成一排,看着这些黑白两色的棋子,小A同学强迫症又犯了:他不喜欢白色棋子出现在黑色棋子的右边。
现在问题来了,他想用盒子中任意黑色或者白色的棋子进行替换,使得刚刚排好的一排棋子中没有上述情况,并且替换的棋子数最少。
现在问题来了,他想用盒子中任意黑色或者白色的棋子进行替换,使得刚刚排好的一排棋子中没有上述情况,并且替换的棋子数最少。
输入
“W”和“B”分别代表白色和黑色的棋子,输入包含两行,第一行为一个正整数N,表示棋子数量,第二行为长度为N的字符串,表示原始黑白棋子的排列。
输出
输出一个数,表示最少替换数。
样例输入
输入1:
3
BWB
输入2:
5
BWBBW
输入3:
9
WWWWWWWWW
样例输出
输出1:
1
输出2:
2
输出3:
0
提示
数据范围:
1<=N<=1e6
1<=N<=1e6
一道非常傻(有毒)的一道题,就是用前缀和瞎搞...,记录当前点的左边的黑子数,右边的白字数,然后打擂台就好了,代码:
#include<bits/stdc++.h> using namespace std; int n,m; int a[1000001]; int ans1[1000001],ans2[1000001]; int minn=9999999; int main(){ cin>>n; for(int i=1;i<=n;i++){ char h; cin>>h; if(h=='B') a[i]=1; else a[i]=0; if(h=='B'){ ans1[i]=1+ans1[i-1]; } else{ ans1[i]=ans1[i-1]; } } for(int i=n;i>=1;i--){ if(a[i]==0){ ans2[i]=1+ans2[i+1]; } else{ ans2[i]=ans2[i+1]; } } for(int i=1;i<=n;i++){ minn=min(ans1[i]+ans2[i]-1,minn); } cout<<minn; }
然后没了