POJ 3276 (开关问题)
题目链接: http://poj.org/problem?id=3276
题目大意:有一些牛,头要么朝前要么朝后,现在要求确定一个连续反转牛头的区间K,使得所有牛都朝前,且反转次数m尽可能小。
解题思路:
首先不要看错题意了,不是求最小K,不要二分。而且反转区间长度一定是K,小于K是不能反转的。
很明显得枚举K(1...n),并且有以下反转思路:
①从第一头牛开始,如果朝前,不管了。看下一头牛,如果朝后反转K长度区间.....一直扫到区间结束。
②第一趟结束后,如果不符合要求,继续重复①,直到所有牛都朝前。
这样复杂度是O(n^3),5000*5000*5000,标准TLE。
其实确定反转次数只需要扫一趟就行了,没有必要来回多趟。O(n^2)就能解决,这里借鉴了tmeteorj的依赖关系法,非常简洁。
它的思路是这样的:
f[i]保存的当前牛与前一头牛的关系,不同1,同0。其中设置一个0牛,方向为F。
这样,如果f[i]=1,则表示[i-1,i+k-1]这个区间需要反转,其中f值变化的只有f[i]和f[i+k]。中间的值没有变化。
对于每个K,从1扫到n-k+1,如果f[i]=1则进行反转操作,反转之后变化的部分立刻反馈,这样当处理i+1时,就能保证当前状态是处理i+1的最后一趟的状态。
原因很简单,在O(n^3)的方法里,我们来回扫,不过是把值来回重复循环,毫无意义。使用这种关系依赖法之后,就可以避免这些毫无意义的循环。
对于n+k+2~n的部分,只要出现需要反转的,则本次K是无效的。继续看下一个K。
否则,更新一下ansm和ansk。
#include "cstdio"
#include "cstring"
int f[],now[],n,ansm,ansk;
int main()
{
//freopen("in.txt","r",stdin);
char key,last='F';
ansm=0x3f3f3f3f;
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf(" %c",&key);
if(key!=last) f[i]=;
last=key;
}
for(int k=;k<=n;k++)
{
memcpy(now,f,sizeof(f));
int cnt=;
for(int i=;i<=n-k+;i++)
if(now[i]) {cnt++;now[i+k]^=;}
for(int i=n-k+;i<=n;i++)
if(now[i]) {cnt=0x3f3f3f3f;break;}
if(cnt<ansm) {ansm=cnt;ansk=k;}
}
printf("%d %d\n",ansk,ansm);
}
| 13594393 | neopenx | 3276 | Accepted | 196K | 329MS | C++ | 648B | 2014-11-03 17:24:07 |
POJ 3276 (开关问题)的更多相关文章
- 反转(开关问题) POJ 3276
POJ 3276 题意:n头牛站成线,有朝前有朝后的的,然后每次可以选择大小为k的区间里的牛全部转向,会有一个最小操作m次使得它们全部面朝前方.问:求最小操作m,再此基础上求k. 题解:1.5000头 ...
- 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 ...
- POJ 1681 (开关问题+高斯消元法)
题目链接: http://poj.org/problem?id=1681 题目大意:一堆格子,或白或黄.每次可以把一个改变一个格子颜色,其上下左右四个格子颜色也改变.问最后使格子全部变黄,最少需要改变 ...
- POJ 1222 (开关问题+高斯消元法)
题目链接: http://poj.org/problem?id=1222 题目大意:一堆开关,或开或关.每个开关按下后,周围4个方向开关反转.问使最后所有开关都关闭的,开关按法.0表示不按,1表示按. ...
- poj 1830 开关问题
开关问题 题意:给n(0 < n < 29)开关的初始和最终状态(01表示),以及开关之间的关联关系(关联关系是单向的输入a b表示a->b),问有几种方式得到最终的状态.否则输出字 ...
- POJ 1830 开关问题(高斯消元)题解
思路:乍一看好像和线性代数没什么关系.我们用一个数组B表示第i个位置的灯变了没有,然后假设我用u[i] = 1表示动开关i,mp[i][j] = 1表示动了i之后j也会跟着动,那么第i个开关的最终状态 ...
- POJ 1830 开关问题(Gauss 消元)
开关问题 Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 7726 Accepted: 3032 Description ...
- POJ 1830 开关问题 【01矩阵 高斯消元】
任意门:http://poj.org/problem?id=1830 开关问题 Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 1 ...
随机推荐
- Hive学习路线图(转)
Hadoophivehqlroadmap学习路线图 1 Comment Hive学习路线图 Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, Pig ...
- 四、优化及调试--网站优化--Yahoo军规上
什么是Yahoo军规?即如何提高网站速度的知识. 具体如下: 1.尽量减少HTTP请求个数——须权衡 什么是http请求:从客户端到服务器端的请求消息.包括消息首行中,对资源的请求方法,资源的标识符及 ...
- 设计模式学习之迭代器模式(Iterator,行为型模式)(17)
参考地址:http://www.cnblogs.com/zhili/p/IteratorPattern.html 一.介绍迭代器是针对集合对象而生的,对于集合对象而言,必然涉及到集合元素的添加删除操作 ...
- 取得表中数据的insert语句
Build Insert Statements for the Existing Data in Tables 下面这个脚本实现了取得一个非空表中的所有insert语句 This script bui ...
- spring 集成 log4j 配置
在web.xml中增加如下代码: <context-param> <param-name>log4jConfigLocation</param-name> < ...
- 5-04用Sql语句创建表
用Sql语句创建表的基本语法: USE E_Market--指向当前所操作的数据库 GO CREATE TABLE CommoditySort--创建表的名字 { sortID int IDENTIT ...
- hdu 4731 2013成都赛区网络赛 找规律
题意:找字串中最长回文串的最小值的串 m=2的时候暴力打表找规律,打表可以用二进制枚举
- .deb文件打包
最近因项目需要,需要把文件夹打包为.deb格式的包,幸亏一位朋友帮忙指导了我一个晚上,才得以完成,这里再次对他表示感谢. 整理打包流程如下: 请先参考此博客内容,了解deb文件打包 如何制作Deb包和 ...
- WPF标准控件模板查看程序(文件里面)
xaml <Window x:Class="ControlTemplateBrowser.MainWindow" xmlns="http://schemas.mic ...
- 【SQL 数据库】将一张数据表信息复制到另一张数据表
一.MySQL数据库 1.如果目标表存在 INSERT INTO 目标表 SELECT * FROM 源表; 2.如果目标表不存在 CREATE TABLE 目标表 SELECT * FROM ...