传送门:Problem 3276

参考资料:

  [1]:挑战程序设计竞赛

先献上AC代码,题解晚上再补

题意:

  John有N头牛,这些牛有的头朝前("F"),有的朝后("B"),John想让所有的牛头都超前。

  现在,John得到了一个机器,每次可以让连续的 K 头牛转向,问最少需要用多少次(M)机器可以使所有的牛头都超前?

题解:

  变量解释:

    dir[i] : dir[i]=0 -> 第i头牛面朝前;dir[i]=1 -> 第i头牛面朝后

    f[i] : f[i]=0 -> 在第i头牛出不进行反转操作;f[i]=1 -> 在第i头牛出进行反转操作

  首先,需要明白两点:

    (1):交换区间反转的顺序对结果是没有影响的。

    (2):对同一个区间进行两次以上的反转是多余的。

  因此,问题就转化成了求需要被反转的区间的集合。

  定义 k : 每次需要反转的牛的个数(1 <= k <= N)

     i : 第 i 头牛(1 <= i <= N-k+1,初始 i =  1)

    sum : 受前面反转影响([i-k+1,i-1]),来到第 i 头牛,总共反转的次数

    res : 存储反转次数

  (1):对于第i头来说,如果它是面朝后的,则需要一次反转使其面朝前,而之后的反转区间指定不包含此牛。

  (2):判断第i头牛是否需要反转,如果需要,f[i]=1,res++;i++;

  (3):重复(2)过程,直到 i > N-k+1为止

AC代码:

 #include<iostream>
#include<cstdio>
using namespace std;
const int maxn=5e3+; int N;
int dir[maxn];
int f[maxn]; int Calculate(int k)
{
int res=;
int sum=;
for(int i=;i <= N-k+;++i)
{
if(i-k > )//当前的i只受到区间 [i-k+1,i-1] 反转的影响,所以需要去除i-k对i的反转影响
sum -= f[i-k];
if((dir[i]+sum)% != )//判断dir[i] 是否为偶数,偶数代表面朝前
f[i]=,res++;
sum += f[i];
}
for(int i=N-k+;i <= N;++i)//检查后 k-1头牛是否全都面朝前
{
if(i-k > )//解释同上
sum -= f[i-k];
if((dir[i]+sum)% != )
return -;
}
return res;
}
void Solve()
{
int K=,M=N;
for(int k=;k <= N;++k)//每次反转 k 头牛
{
int m=Calculate(k);
if(m != - && m < N)
K=k,M=m;
}
printf("%d %d\n",K,M);
} int main()
{
scanf("%d",&N);
for(int i=;i <= N;++i)
{
getchar();
char ch=getchar();
dir[i]=(ch == 'F' ? :);
}
Solve();
}

poj 3276(反转)的更多相关文章

  1. 反转(开关问题) POJ 3276

    POJ 3276 题意:n头牛站成线,有朝前有朝后的的,然后每次可以选择大小为k的区间里的牛全部转向,会有一个最小操作m次使得它们全部面朝前方.问:求最小操作m,再此基础上求k. 题解:1.5000头 ...

  2. POJ 3276 Face The Right Way 反转

    大致题意:有n头牛,有些牛朝正面,有些牛朝背面.现在你能一次性反转k头牛(区间[i,i+k-1]),求使所有的牛都朝前的最小的反转次数,以及此时最小的k值. 首先,区间反转的顺序对结果没有影响,并且, ...

  3. POJ 3276 Face The Right Way(反转)

      Face The Right Way Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6038   Accepted: 2 ...

  4. POJ 3276 (开关问题)

    题目链接: http://poj.org/problem?id=3276 题目大意:有一些牛,头要么朝前要么朝后,现在要求确定一个连续反转牛头的区间K,使得所有牛都朝前,且反转次数m尽可能小. 解题思 ...

  5. Enum:Face The Right Way(POJ 3276)

    面朝大海,春暖花开 题目大意:农夫有一群牛,牛排成了一排,现在需要把这些牛都面向正确的方向,农夫买了一个机器,一次可以处理k只牛,现在问你怎么处理这些牛才可以使操作数最小? 这道题很有意思,其实这道题 ...

  6. POJ 3276 Face The Right Way 翻转(开关问题)

    题目:Click here 题意:n头牛排成一列,F表示牛面朝前方,B表示面朝后方,每次转向K头连续的牛的朝向,求让所有的牛都能面向前方需要的最少的操作次数M和对应的最小的K. 分析:一个区间反转偶数 ...

  7. Face The Right Way POJ - 3276 (开关问题)

    Face The Right Way Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6707   Accepted: 312 ...

  8. Face The Right Way POJ - 3276(区间)

    Farmer John has arranged his N (1 ≤ N ≤ 5,000) cows in a row and many of them are facing forward, li ...

  9. Face The Right Way(POJ 3276)

    原题如下: Face The Right Way Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6708   Accepte ...

随机推荐

  1. Jmeter(非GUI模式)教程

    前言 使用非 GUI 模式,即命令行模式运行 JMeter 测试脚本能够大大缩减所需要的系统资源.优点如下:1.节约系统资源:无需启动界面,节约系统资源 2.便捷快速:仅需启动命令行,输入命令便可执行 ...

  2. hashContext

    java.lnag.Object中对hashCode的约定: 1. 在一个应用程序执行期间,如果一个对象的equals方法做比较所用到的信息没有被修改的话,则对该对象调用hashCode方法多次,它必 ...

  3. 【M2】软件工程终期总结报告——阅读作业

    PhylabWeb——阅读作业 问题回顾 提问博客地址:http://www.cnblogs.com/kibbon/p/4831104.html 尚待解决的问题: Alpha/Beta,ZBB/RC阶 ...

  4. BUAAMOOC项目终审报告

    工作总结 我们是歪果仁带你灰开发团队.我们开发的项目是北航学堂(MOOC)的android客户端:BUAAMOOC. 目前我们完成了主要功能,包括UI设计,视频播放,视频下载,学习进度,个人信息等功能 ...

  5. Linux课题实践五——字符集总结与分析

    Linux课题实践三——字符集总结与分析 20135318  刘浩晨 字符是各种文字和符号的总称,包括各国家文字.标点符号.图形符号.数字等.字符集是多个字符的集合,字符集种类较多,每个字符集包含的字 ...

  6. 小学生四则运算App实验成果

    组名:会飞的小鸟 组员:徐侃 陈志棚  罗伟业 刘芮熔 —成员分工: —①刘芮熔:设置安卓包.界面的代码,界面的排序. —②陈志棚:加减乘除的判断异常处理,例如除数不能为零的异常处理等问题. —③徐侃 ...

  7. SQL中常用函数

    SELECT CONVERT(varchar(100), GETDATE(), 23) AS  日期   结果:2017-01-05     select ISNULL(price,'0.0')   ...

  8. Hadoop and net core a match made in docker

    https://blog.sixeyed.com/hadoop-and-net-core-a-match-made-in-docker/

  9. 用java编网页的学习流程,我的一些小心得(初学java到高深运用)

    (1)java基础:首先得会写int,String,for循环,数组,**等等(熟练各种基础的关键字,各种java自带的排序,随即等等算法)什么是封装,继承,多态,然后private,public,p ...

  10. httprequest存储的是字符内容 而文本内容是以字节形式上传的;所以普通的取值方式无法从httprequest取到值

    httprequest存储的是字符内容 而文本内容是以字节形式上传的;所以普通的取值方式无法从httprequest取到值