信息社的同学最近迷上了五子棋,小A同学把一些棋子排成一排,看着这些黑白两色的棋子,小A同学强迫症又犯了:他不喜欢白色棋子出现在黑色棋子的右边。
现在问题来了,他想用盒子中任意黑色或者白色的棋子进行替换,使得刚刚排好的一排棋子中没有上述情况,并且替换的棋子数最少。
标签:print 好的 mil sam i+1 content 黑白棋 前缀 包含
输入1:
3
BWB
输入2:
5
BWBBW
输入3:
9
WWWWWWWWW
输出1:
1
输出2:
2
输出3:
0
不用担心数据范围,只需用前缀和记录当前点的左边的黑子数和右边的白子数,最后记录最小值即可。
#include<bits/stdc++.h> using namespace std; int a[1000005],ans1[1000005],ans2[1000005],n,m,ans=9999999; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { char ch; cin>>ch; if(ch==‘B‘)//前缀和。 { a[i]=1; ans1[i]=ans1[i-1]+1; } else { a[i]=0; ans1[i]=ans1[i-1]; } } for(int i=n;i;i--) { if(a[i]==0) ans2[i]=ans2[i+1]+1;//左侧黑子数。 else ans2[i]=ans2[i+1];//右侧白子数。 } for(int i=1;i<=n;i++) ans=min(ans1[i]+ans2[i]-1,ans); printf("%d",ans); return 0; }
标签:print 好的 mil sam i+1 content 黑白棋 前缀 包含
原文地址:https://www.cnblogs.com/DARTH-VADER-EMPIRE/p/11362845.html