码迷,mamicode.com
首页 > 其他好文 > 详细

黑白子

时间:2019-08-16 12:03:02      阅读:96      评论:0      收藏:0      [点我收藏+]

标签:print   好的   mil   sam   i+1   content   黑白棋   前缀   包含   

题目

题目描述
信息社的同学最近迷上了五子棋,小A同学把一些棋子排成一排,看着这些黑白两色的棋子,小A同学强迫症又犯了:他不喜欢白色棋子出现在黑色棋子的右边。 
现在问题来了,他想用盒子中任意黑色或者白色的棋子进行替换,使得刚刚排好的一排棋子中没有上述情况,并且替换的棋子数最少。 
输入
“W”和“B”分别代表白色和黑色的棋子,输入包含两行,第一行为一个正整数N,表示棋子数量,第二行为长度为N的字符串,表示原始黑白棋子的排列。
输出
输出一个数,表示最少替换数。
样例输入
输入1:
3
BWB
输入2:
5
BWBBW
输入3:
9
WWWWWWWWW
样例输出
输出1:
1
输出2:
2
输出3:
0
提示
数据范围: 
1<=N<=1e6 

分析

  不用担心数据范围,只需用前缀和记录当前点的左边的黑子数和右边的白子数,最后记录最小值即可。

代码

#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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!