CodeForces #646 Div.2 B

B题

给定一个数列,该数列由0和1构成,如果其中含有010或者101的子序列,则是不好的序列, 需要用最少的操作将它变为好序列。
在这里插入图片描述
思路,有三种格式的序列是好的,比如00000…0000,111…111 ,1…110…000,000…0111…1;
那么其他的形式只要能转换为这四种之一即可。
那么可以求1的前缀和,然后先判断转换为全0或者全1的情况,然后再尝试逐一转换为前部分全0后部分全1 或者 前部分全1后部分全0.
来看这2n+2种情况谁最小。

import java.util.Scanner;
 
 
/**
 * @创建人 YDL
 * @创建时间 2020/5/31 17:05
 * @描述
 */
public class Solution {
 
 
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int test = Integer.parseInt(sc.nextLine());
        while(test-->0) {
            char[] cs = sc.nextLine().toCharArray();
            int[] sums = new int[cs.length+1];
            for(int i=0;i<cs.length;i++){
                sums[i+1]=sums[i]+cs[i]-'0';
            }
            int ans = Math.min(sums[cs.length],cs.length-sums[cs.length]);
            for(int i=0;i<cs.length;i++){
               ans = Math.min(ans,sums[i+1]+cs.length-i-1+sums[i+1]-sums[cs.length]);
               ans = Math.min(ans,i+1-sums[i+1]+sums[cs.length]-sums[i+1]);
            }
            System.out.println(ans);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值