poj 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(反转)的更多相关文章
- 反转(开关问题) POJ 3276
POJ 3276 题意:n头牛站成线,有朝前有朝后的的,然后每次可以选择大小为k的区间里的牛全部转向,会有一个最小操作m次使得它们全部面朝前方.问:求最小操作m,再此基础上求k. 题解:1.5000头 ...
- POJ 3276 Face The Right Way 反转
大致题意:有n头牛,有些牛朝正面,有些牛朝背面.现在你能一次性反转k头牛(区间[i,i+k-1]),求使所有的牛都朝前的最小的反转次数,以及此时最小的k值. 首先,区间反转的顺序对结果没有影响,并且, ...
- POJ 3276 Face The Right Way(反转)
Face The Right Way Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6038 Accepted: 2 ...
- POJ 3276 (开关问题)
题目链接: http://poj.org/problem?id=3276 题目大意:有一些牛,头要么朝前要么朝后,现在要求确定一个连续反转牛头的区间K,使得所有牛都朝前,且反转次数m尽可能小. 解题思 ...
- Enum:Face The Right Way(POJ 3276)
面朝大海,春暖花开 题目大意:农夫有一群牛,牛排成了一排,现在需要把这些牛都面向正确的方向,农夫买了一个机器,一次可以处理k只牛,现在问你怎么处理这些牛才可以使操作数最小? 这道题很有意思,其实这道题 ...
- POJ 3276 Face The Right Way 翻转(开关问题)
题目:Click here 题意:n头牛排成一列,F表示牛面朝前方,B表示面朝后方,每次转向K头连续的牛的朝向,求让所有的牛都能面向前方需要的最少的操作次数M和对应的最小的K. 分析:一个区间反转偶数 ...
- Face The Right Way POJ - 3276 (开关问题)
Face The Right Way Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6707 Accepted: 312 ...
- 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 ...
- Face The Right Way(POJ 3276)
原题如下: Face The Right Way Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6708 Accepte ...
随机推荐
- jackson出现错误 Unrecognized field,几种处理方法
1.请求的JSON里面字段多余映射的实体类,可以通过在类的顶部添加@JsonIgnoreProperties,2.0版本引入 import org.codehaus.jackson.annotate. ...
- 【Beta版本发布】爬虫队长装备全面更新!
一.Beta阶段目标回顾 1.为了解决Alpha阶段线程异常泛滥的问题,我们需要一个线程池. 2.为了爬取得到的文件正确可用,我们需要一个异常清理器. 3.为了不间断爬取,管理员不必频繁运行程序点,我 ...
- 发布阶段 github和360移动助手及总结
经过一系列的冲刺和加工 最激动人心的无非在发布平台上公布上自己辛苦奋斗了一个周期的产品,这个时候的我们就像Iphone 6发布会上得CEO,为自己的产品完美画上了研发的句号. 接下来的日子就是准备ve ...
- [转帖]浅析java程序的执行过程
浅析java程序的执行过程 转帖来源: https://www.cnblogs.com/wangjiming/p/10315983.html 之前学习过 这一块东西 但是感觉理解的不深刻. copy一 ...
- Oracle 数据表误删恢复 Flashback
1. 前提条件. recyclebin 参数打开. 验证参数是否打开: SHOW PARAMETER RECYCLEBIN 2. 如果参数没有打开的话 需要打开,并且重启一下数据库方法为 alter ...
- ionic3.x开发小坑记录(一)
自定义font的时候,在assets中创建的文件夹名字别用fonts,会与ionic默认样式冲突,在浏览器中调试是正常的,到手机上就出问题了. 在html中写img的src直接如图 assets前面 ...
- linux中tomcat修改错误日志路径
涉及文件 log4j.properties (一般开发将该文件放在项目的缺省目录即源包下,在文件系统里,就是在项目的/src/java目录下,缺省的文件名是log4j.properties,这样项 ...
- javaIO缓冲区
java中IO类分类. 图来自网络 缓冲区:应用程序在内存中开辟的一个空间.用来放置需要被写入或写出的数据. 使用缓冲区的 优点:使得应用程序操作磁盘(或者说是与磁盘的通信)的次数降低,提高应用程序的 ...
- char类型的数值转换
在视频教程中,你已经认识到了数字类型之间.字符串和其他类型之间的转换.而某些时候,我们还需要将char类型转换为int类型,或者把int类型转换为char类型. 这篇文章,将介绍在代码中虽然不太常用, ...
- mysql5.7 rpm安装教程
注意版本和此次更新时间 2017-12-03 版本:mysql-5.7.20-1.el6.x86_64 环境:linux6.x 官方下载地址: wget https://dev.mysql.co ...