描述:

\(
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. 通过Powershell检查SMTP地址是否被检测网站列入黑名单

    通常,我们可能因为某些用户发送了一些非常规邮件,邮件出口地址被一些权威网站列入黑名单,导致大量业务邮件无法正常发送.这时候,我们可以通过powershell写一些关于IP地址检测的脚本,并列入计划任务 ...

  2. slice使用了解

    切片 什么是slice slice的创建使用 slice使用的一点规范 slice和数组的区别 slice的append是如何发生的 复制Slice和Map注意事项 什么是slice Go中的切片,是 ...

  3. AJ学IOS(34)UI之Quartz2D画画板的实现

    AJ分享,必须精品 效果: 实现过程: 首先用storyboard搭建界面,没有什么好说的. 然后就是注意的功能了,这里用了触摸事件来搭配Quartz2D的路径来画画. 思路就是把路径放到数组中 @p ...

  4. 【Java】【常用类】Object 基类 源码学习

    源码总览: 有好些都是native本地方法,背后是C++写的 没有关于构造器的描述,默认编译器提供的无参构造 https://blog.csdn.net/dmw412724/article/detai ...

  5. python2.7安装pip

  6. C - Ivan the Fool and the Probability Theory---div2

    题目连接:https://codeforces.com/contest/1248/problem/C 思路: 注意上下两排的关系,如果说上面那一排有两个方格连续,那么他相邻的两排必定和他相反,如果说当 ...

  7. 再看CVE-2018-12613 phpmyadmin后台文件包含&&RPO攻击

    写在前面 因为看了朋友的一篇分析又回头想了想自己去年遇到的这个纠结的问题. 去年写过一篇phpmyadmin后台文件包含的文章,写的非常的草草,并没有分析的过程,只是把自己的问题记了下来.当时纠结于最 ...

  8. bytectf2019 boring_code的知识学习&&无参数函数执行&&上海市大学生CTF_boring_code+

    参赛感悟 第三次还是第二次参加这种CTF大赛了,感悟和学习也是蛮多的,越发感觉跟大佬的差距明显,但是还是要努力啊,都大三了,也希望出点成绩.比赛中一道WEB都没做出来,唯一有点思路的只有EZCMS,通 ...

  9. python里的内置函数你知道有多少个吗?

    Python 内置函数最全汇总: 1 abs() 绝对值或复数的模 2 all() 接受一个迭代器,如果迭代器的所有元素都为真,那么返回True,否则返回False 3 any() 接受一个迭代器,如 ...

  10. 【考试总结】欢乐模拟赛_Day2

    \(T1\) 题目描述 在仙界中有着 \(n\) 位神仙, 每位神仙用一个 \(1 ∼ n\) 的特异编号表示, 老祖 \(ChitongZ\) 的编号为 \(1\) . 除去至尊至圣, 统管仙界的老 ...