描述:

\(
N 头牛排成了一列。每头牛或者向前或者向后。为了让所有的牛都面向前方,农夫约翰买了 一台自动转向的机器。
这个机器在购买时就必须设定一个数值 K,机器每操作一次恰好使 K 头连续的牛转向。
请求出为了让所有的牛都能面向前方需要的最少的操作次数 M 和对应的 最小的 K。
前是'F',后是'B'\)

枚举一个K,然后考虑如何求出此时的M.

一、如果第一头牛需要反转,因为只有1-K这个区间包含它,所以一定要翻转

二、考虑第二头牛,如果需要翻转那么重复上面的步骤。

这样的复杂度是\(O(n^3)\)

每次翻转牛,需要把k头牛都去翻转,这太麻烦了,可以优化掉。

用\(f[i]\)表示以i为起点的区间是否翻转过

那么如果f[i]=1,它的效果一直持续到f[i+k]就失效了

所以维护一个sumn变量,表示在i以前k-1头牛翻转过的次数

那么每次循环,要sumn-=f[i-k+1],因为已经失效

#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int n,f[5009];//f[i]表示i,i+1,.....i+k-1牛都反转
char cow[5009];
int fun(int k)
{
memset(f,0,sizeof(f));
int ans=0;//反转次数
int sumn=0;
for(int i=1;i<=n-k+1;i++)
{
if(sumn%2==0&&cow[i]=='B')//要反转了
f[i]=1,ans++;
else if(sumn%2==1&&cow[i]=='F')//要反转了
f[i]=1,ans++;
sumn+=f[i];
if(i-k+1>=1) sumn-=f[i-k+1];
}
//第n-k+2头牛以后不能反转了,判断是否可行
for(int i=n-k+2;i<=n;i++)
{
if(sumn%2==0&&cow[i]=='B') return -1;
else if(sumn%2==1&&cow[i]=='F') return -1;
sumn+=f[i];
if(i-k+1>=1) sumn-=f[i-k+1];
}
return ans;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>cow[i];
int k,ans=999999999;
for(int i=1;i<=n;i++)//判断步长i时是否可行
{
int x=fun(i);
if(x!=-1&&x<ans)
k=i,ans=x;
}
cout<<k<<" "<<ans;
}

Face The Right Way 开关(POJ3276)的更多相关文章

  1. 挑战程序竞赛 反转开关 poj3276

    这个我其实也没有看太懂它的证明过程. 1.若某一个位置被翻转了n次,则其实际上被翻转了n%2次. 2.分析易知翻转的顺序并不影响最终结果. 3.现在我们着眼于第1个位置,可知若要将第1个位置进行翻转只 ...

  2. Face The Right Way [POJ3276] [开关问题]

    题意: 有n头奶牛排成一排,有的朝前(F)有的朝后(B),现在你可以使k头奶牛一次性翻转朝向(n>=k>=1),问你最少的翻转次数和此时对应的k值. Input Line 1: A sin ...

  3. POJ3276 Face The Right Way 开关问题

    ①每个K从最左边进行考虑 ②f[i]=[i,i+k-1]是否进行反转:1代表是,0代表否 ③∑ (i)(i=i+1-K+1) f[j]=∑ (i-1)(i=i-K+1) f[j]+f[i]-f[i-K ...

  4. The Water Bowls [POJ3185] [开关问题]

    题意 一串长度为20的0,1数列,每次翻转i,会影响i-1,i+1,也被翻转,最少翻转成0的步骤数是多少? Sample Input 0 0 1 1 1 0 0 1 1 0 1 1 0 0 0 0 0 ...

  5. Fliptile [POJ3279] [开关问题]

    题意 给定一张n*m的方格图,有1,0两种数字,每次可以选取一个十字进行翻转,1变成0,0变成1,问最少需要翻转几次,使它全部变成0,全部如果有重复的,按字典序最小的进行输出: 输入 第一行n,m 下 ...

  6. 手游聚合SDK开发之远程开关---渠道登入白名单

    白名单有啥好说的呢?无非就是筛选登入,大家第一眼看到就是这个印象,白名单也是有文章的,弄的时机不同会给你带来很不错的收益,注意是收益.还是举例来说,游戏上线前渠道都会做一个预下载,一般提前1-2天,这 ...

  7. TYPESDK手游聚合SDK客户端远程开关:渠道支付黑名单

    渠道支付要做开关干嘛用呢?为什么要做这种东西呢? 这个教训来分享一下,我们的游戏上线公测了,59个渠道首发,其中包括了应用宝,UC,360等的大渠道,也包含有一些工会渠道和小渠道,上线后一切正常,但是 ...

  8. iOS系列 基础篇 09 开关、滑块和分段控件

    iOS系列 基础篇 09 开关.滑块和分段控件 目录: 案例说明 开关控件Switch 滑块控件Slider 分段控件Segmented Control 1. 案例说明 开关控件(Switch).滑块 ...

  9. Context值和bool开关

      Context值和bool开关的相关内容 Context值分为2种 系统默认的context值 服务的context值 Context值的作用 主要是防止有未知文件进入目录文件之中(如将病毒拷贝到 ...

随机推荐

  1. CentOS 7 yum安装 k8s 创建Pod一直处于ContainerCreating状态 问题解决

    问题描述 使用CentOS7的 yum 包管理器安装了 Kubernetes 集群,使用 kubectl 创建服务成功后,执行 kubectl get pods,发现AGE虽然在不断增加,但状态始终不 ...

  2. Netty是如何处理新连接接入事件的?

    更多技术分享可关注我 前言 前面的分析从Netty服务端启动过程入手,一路走到了Netty的心脏——NioEventLoop,又总结了Netty的异步API和设计原理,现在回到Netty服务端本身,看 ...

  3. k8s~helm镜像版本永远不要用latest

    对于容器编排工具k8s来说,你可以使用它规定的yaml格式的脚本,使用客户端kubectl来与k8s进行通讯,将你定义好的yaml部署脚本应用到k8s集群上,而这对yaml脚本一般来说都是很像的,就是 ...

  4. Xcode 6.3.1Mac版 V6.4.Beta3免费下载

    Xcode for mac是Mac OS系统以及IOS系统开发者专用于构建 Mac OS X 及 iOS 应用程序的完整工具集 - Xcode 5 的工具经过重新设计,它们的性能更优秀.使用更容易,能 ...

  5. [算法]Huffman树(哈夫曼树)

    目录 一.关于Huffman树 二.具体实现 例1:P1090 合并果子 例2:P2168 [NOI2015]荷马史诗 一.关于Huffman树 Huffman树(哈夫曼树)可以解决下述问题: 一颗\ ...

  6. C# windows服务没有RunInstallerAttribute.Yes的公共安装程序

    1.在视图状态 右键添加ServiceInstaller及ServiceProcessInstaller两个控件; 2.将serviceProcessInstaller类的Account属性改为 Lo ...

  7. python实现服务器监控报警消息用微信发送(附代码)

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:NicePython PS:如有需要Python学习资料的小伙伴可以加 ...

  8. L1线性回归

    线性回归 主要内容包括: 线性回归的基本要素 线性回归模型从零开始的实现 线性回归模型使用pytorch的简洁实现 代码下载地址 https://download.csdn.net/download/ ...

  9. 【WPF学习】第六十七章 创建自定义面板

    前面两个章节分别介绍了两个自定义控件:自定义的ColorPicker和FlipPanel控件.接下来介绍派生自定义面板以及构建自定义绘图控件. 创建自定义面板是一种特殊但较常见的自定义控件开发子集.前 ...

  10. ppt和pptx转图片完整代码,解决2003版和2007版中文乱码问题

    引入所需依赖,注意poi版本,新版本不支持,最好使用和我一样的版本. <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --& ...