题目再次链接

题意:

  已知01序列a,求进行定长子串取反的最少操作次数,以及最少时的定长。

分析:

  首先,先想一想怎么暴力吧。这样想:要保证最小,那么必然不会对同一个区间反转两次,而在k一定时,则不会以同一个数为起点反转两次,于是我们有如果第一个数是0,则反转,是1,则不反转,第一个是否反转就可以确定了,然后按照反转操作进行反转,反转完之后再判断第二个,一直到最后一个(如果区间后端超了n,那么将不会反转成功),然后我们枚举k找到满足条件的k,以及其反转次数。

  暴力还是比较简单的,就是枚举+模拟,但是这样的复杂的接受不了。怎么办呢,我们想想可以对哪个环节进行优化,枚举环节好像没啥,该枚举还是要枚举。

  那模拟环节呢,你会发现,其实我们判断他需不需要改变是1的,只不过是模拟改变的过程还要走一遍k,这是复杂度无法接受的原因,那么我们能不能在保证判断是1的情况下改掉模拟修改的复杂度,当然不一定是模拟,总之要找一种方法记录下来修改保证判断操作是1.

  其实还是比较好想到的:因为我们在判断i的过程中只需考虑它前面k-1个区间的修改次数,这个就相对好记录了,边判断边记录就可以了,这样维护它被修改的次数的操作也变为1了。问题就迎刃而解了。

代码:

 

#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
const int maxn=+;
bool a[maxn];
int f[maxn];
int sum[maxn];
int Co(int k,int n){
memset(f,,sizeof(f));
memset(sum,,sizeof(sum));
for(int i=;i<=n;i++){
bool js=a[i];
if((sum[i-]-sum[(i-k)>?(i-k):])%)
js=!js;
if(js){
if(i+k->n)
return -;
f[i]=;
}
sum[i]=f[i]+sum[i-];
}
return sum[n];
}
int main(){
int n;
scanf("%d",&n);
char js;
for(int i=;i<=n;i++){
scanf(" %c",&js);
if(js=='B')
a[i]=;
}
int k;
int jsjs;
int ans=1e9;
int ans2;
for(k=n;k>=;k--)
if(jsjs=Co(k,n)+){
if(jsjs-<ans){
ans=jsjs-;
ans2=k;
}
}
printf("%d %d",ans2,ans);
return ;
}//注释就暂时不写啦

Face The Right Way思维。。。的更多相关文章

  1. [C#][算法] 用菜鸟的思维学习算法 -- 马桶排序、冒泡排序和快速排序

    用菜鸟的思维学习算法 -- 马桶排序.冒泡排序和快速排序 [博主]反骨仔 [来源]http://www.cnblogs.com/liqingwen/p/4994261.html  目录 马桶排序(令人 ...

  2. Photoshop、Illustrator思维导图笔记

    半年前学习Photoshop时记得的思维导图笔记,可能不是很全,常用的基本都记下了.

  3. CYQ.Data 从入门到放弃ORM系列:开篇:自动化框架编程思维

    前言: 随着CYQ.Data 开始回归免费使用之后,发现用户的情绪越来越激动,为了保持这持续的激动性,让我有了开源的念头. 同时,由于框架经过这5-6年来的不断演进,以前发的早期教程已经太落后了,包括 ...

  4. 计算机程序的思维逻辑 (8) - char的真正含义

    看似简单的char 通过前两节,我们应该对字符和文本的编码和乱码有了一个清晰的认识,但前两节都是与编程语言无关的,我们还是不知道怎么在程序中处理字符和文本. 本节讨论在Java中进行字符处理的基础 - ...

  5. 计算机程序的思维逻辑 (29) - 剖析String

    上节介绍了单个字符的封装类Character,本节介绍字符串类.字符串操作大概是计算机程序中最常见的操作了,Java中表示字符串的类是String,本节就来详细介绍String. 字符串的基本使用是比 ...

  6. 计算机程序的思维逻辑 (31) - 剖析Arrays

    数组是存储多个同类型元素的基本数据结构,数组中的元素在内存连续存放,可以通过数组下标直接定位任意元素,相比我们在后续章节介绍的其他容器,效率非常高. 数组操作是计算机程序中的常见基本操作,Java中有 ...

  7. 计算机程序的思维逻辑 (33) - Joda-Time

    Joda-Time上节介绍了JDK API中的日期和时间类,我们提到了JDK API的一些不足,并提到,实践中有一个广泛使用的日期和时间类库,Joda-Time,本节我们就来介绍Joda-Time.俗 ...

  8. 计算机程序的思维逻辑 (53) - 剖析Collections - 算法

    之前几节介绍了各种具体容器类和抽象容器类,上节我们提到,Java中有一个类Collections,提供了很多针对容器接口的通用功能,这些功能都是以静态方法的方式提供的. 都有哪些功能呢?大概可以分为两 ...

  9. 成吨提高开发效率:Intellij Shortcuts精简子集与思维模式

    在线精简cheatsheet备查表:intellij.linesh.twGithub项目:intellij-mac-frequent-keymap Intellij的快捷键多而繁杂,从官方推荐的key ...

  10. "Becoming Functional" 阅读笔记+思维导图

    <Becoming Functional>是O'Reilly公司今年(2014)7月发布的一本薄薄的小册子,151页,介绍了函数式编程的基本概念.全书使用代码范例都是基于JVM的编程语言, ...

随机推荐

  1. Python—变量,条件语句,while循环,运算符,字符串等

     Python初识以及变量: 变量名:——字母 ——数字 ——下划线[见名识意] (PS:数字不能开头:不能是关键字:最好不能和python内置的东西重复) ##################### ...

  2. EasyARM-iMX257 linxu两年前的笔记

    第三章续:简单总结第三章中出现的命令! 1)  root@EasyARM-iMX257 ~# ddif=/dev/zero of=/dev/shm/disk bs=1024 count=10240 d ...

  3. JMeter接口压测和性能监测

    JMeter接口压力测试总结 一.安装JMeter 1.     在客户端机器上安装JMeter压测工具,我这里安装的版本是apache-jmeter-5.2.1,由于JMeter是JAVA语言开发的 ...

  4. [C#.NET 拾遗补漏]05:操作符的几个骚操作

    阅读本文大概需要 1.5 分钟. 大家好,这是极客精神[C#.NET 拾遗补漏]专辑的第 5 篇文章,今天要讲的内容是操作符. 操作符的英文是 Operator,在数值计算中习惯性的被叫作运算符,所以 ...

  5. Source insight 提示: it is not currently available for write access

    点击阅读原文 使用sourceinsight编辑linux内核文件后不能保存,并且弹出窗口揭示:Error: "Z:\linux\kernel\kernel-2.6.13\scripts\k ...

  6. VSCode + WSL 2 + Ruby环境搭建详解

    vscode配置ruby开发环境 vscode近年来发展迅速,几乎在3年之间就抢占了原来vim.sublime text的很多份额,犹记得在2015-2016年的时候,ruby推荐的开发环境基本上都是 ...

  7. ca72a_c++_标准IO库:面向对象的标准库

    /*ca72a_c++_标准IO库:面向对象的标准库继承:基类->派生类3个头文件9个标准库类型IO对象不可复制或赋值 ofstream, f--file,文件输出流ostringstream, ...

  8. v-model指令的学习(双向绑定)

    v-bind 只能实现数据的单项绑定,从data到view,无法实现双向绑定 v-model可以实现表单元素和model中数据的双向绑定 注意:model只能运用到表单元素中 如:input sele ...

  9. Spring系列.事务管理原理简析

    Spring的事务管理功能能让我们非常简单地进行事务管理.只需要进行简单的两步配置即可: step1:开启事务管理功能 @Configuration //@EnableTransactionManag ...

  10. 黎活明8天快速掌握android视频教程--25_网络通信之资讯客户端

    1 该项目的主要功能是:后台通过xml或者json格式返回后台的视频资讯,然后Android客户端界面显示出来 首先后台新建立一个java web后台 采用mvc的框架 所以的servlet都放在se ...