• 黑白子


    题目

    题目描述
    信息社的同学最近迷上了五子棋,小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;
    }
    
  • 相关阅读:
    本地发送博客
    0.查看Android framework源码
    flutter_5_深入_2_深入layout、paint流程
    flutter_5_深入_1_深入widget树和构建流程
    flutter_5_深入_0_每帧的处理流程简介
    蓝牙基础
    Android低功耗蓝牙开发
    flutter2_widget_3布局类组件1
    flutter2_widget_1简介
    Android gradle Plugin
  • 原文地址:https://www.cnblogs.com/DARTH-VADER-EMPIRE/p/11362845.html
Copyright © 2020-2023  润新知