Face The Right Way 开关(POJ3276)
描述:
\(
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)的更多相关文章
- 挑战程序竞赛 反转开关 poj3276
这个我其实也没有看太懂它的证明过程. 1.若某一个位置被翻转了n次,则其实际上被翻转了n%2次. 2.分析易知翻转的顺序并不影响最终结果. 3.现在我们着眼于第1个位置,可知若要将第1个位置进行翻转只 ...
- Face The Right Way [POJ3276] [开关问题]
题意: 有n头奶牛排成一排,有的朝前(F)有的朝后(B),现在你可以使k头奶牛一次性翻转朝向(n>=k>=1),问你最少的翻转次数和此时对应的k值. Input Line 1: A sin ...
- 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 ...
- 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 ...
- Fliptile [POJ3279] [开关问题]
题意 给定一张n*m的方格图,有1,0两种数字,每次可以选取一个十字进行翻转,1变成0,0变成1,问最少需要翻转几次,使它全部变成0,全部如果有重复的,按字典序最小的进行输出: 输入 第一行n,m 下 ...
- 手游聚合SDK开发之远程开关---渠道登入白名单
白名单有啥好说的呢?无非就是筛选登入,大家第一眼看到就是这个印象,白名单也是有文章的,弄的时机不同会给你带来很不错的收益,注意是收益.还是举例来说,游戏上线前渠道都会做一个预下载,一般提前1-2天,这 ...
- TYPESDK手游聚合SDK客户端远程开关:渠道支付黑名单
渠道支付要做开关干嘛用呢?为什么要做这种东西呢? 这个教训来分享一下,我们的游戏上线公测了,59个渠道首发,其中包括了应用宝,UC,360等的大渠道,也包含有一些工会渠道和小渠道,上线后一切正常,但是 ...
- iOS系列 基础篇 09 开关、滑块和分段控件
iOS系列 基础篇 09 开关.滑块和分段控件 目录: 案例说明 开关控件Switch 滑块控件Slider 分段控件Segmented Control 1. 案例说明 开关控件(Switch).滑块 ...
- Context值和bool开关
Context值和bool开关的相关内容 Context值分为2种 系统默认的context值 服务的context值 Context值的作用 主要是防止有未知文件进入目录文件之中(如将病毒拷贝到 ...
随机推荐
- std::forward和std::move
std::forward完美转发 保证参数原来的属性(用在template的参数是引用的时候):左值引用在被转发之后仍然保持左值属性,右值引用在被转发之后依然保持右值属性 void show(int& ...
- replace into 影响行数
replace into 影响行数,谈起影响行数,先理解replace into 原理:其是先到表里通过一定规则(单主键或复合主键或唯一索引)找到记录,并且删除,然后在insert into 记录,即 ...
- 【Java】关键字 和 保留字
Java的关键字[Keyword]和 保留字[Reserved word] 官方描述: https://docs.oracle.com/javase/tutorial/java/nutsandbolt ...
- 这本最适合夯实基础的经典 Java 书籍,可能80% 的 Java 程序员没有认真看过!
公众号[程序员书单]出品,转载请注明出处 作者:黄小斜 今天要给大家带来的一本书,是大名鼎鼎的head first系列丛书的一本<head first Java>相信很多学习Java的朋友 ...
- ES6新特性箭头函数和常用function()对比
// 无参 var fn1 = function() {} var fn1 = () => {} // 单个参数 var fn2 = function(a) {} var fn2 = a =&g ...
- python干货:5种反扒机制的解决方法
前言 反爬虫是网站为了维护自己的核心安全而采取的抑制爬虫的手段,反爬虫的手段有很多种,一般情况下除了百度等网站,反扒机制会常常更新以外.为了保持网站运行的高效,网站采取的反扒机制并不是太多,今天分享几 ...
- 【特征检测】BRISK特征提取算法
[特征检测]BRISK特征提取算法原创hujingshuang 发布于2015-07-24 22:59:21 阅读数 17840 收藏展开简介 BRISK算法是2011年ICCV上< ...
- [V&N2020 公开赛]TimeTravel 复现
大佬友链(狗头):https://www.cnblogs.com/p201821440039/ 参考博客: https://www.zhaoj.in/read-6407.html https://cj ...
- 微信小程序标签常见知识点归纳整理
1. <image src='/images/logo.png' mode='widthFix'></image> mode 属性表示图片随着指定的宽度自动拉伸以显示原图的正确 ...
- Java集合案例(产生不重复随机数)
获取10个1-20之间的随机数,要求不能重复 用数组实现,但是数组的长度是固定的,长度不好确定.所以我们使用集合实现. 分析:A:创建产生随机数的对象B:创建一个存储随机数的集合C:定义一个统计变量. ...