Enum:Face The Right Way(POJ 3276)

题目大意:农夫有一群牛,牛排成了一排,现在需要把这些牛都面向正确的方向,农夫买了一个机器,一次可以处理k只牛,现在问你怎么处理这些牛才可以使操作数最小?
这道题很有意思,其实这道题是著名的开关问题的变种,我们可以用模拟去做,但是总不能一个一个地去翻转,不然就是2^n的复杂度了,我们要想另外一些方法。
我们知道,如果连续翻转同一片区域其实等于没有反转,再者,在翻转位置一样的情况下,先翻转谁其实没有太打大的关系,所以我们可以规定一个顺序(比如从左到右翻转),如果规定了一个方向翻转以后,我们可以翻转过后的左区域以后都不会受到影响,所以这样我们就可以像矩阵乘法一样把k不断增长来把复杂度降下去O(N^3)(K个长度,每个长度最多操作N个数,每个数翻转K次)但是这样对于N=5000来说还是太大了,我们要继续把复杂度降下去。
我们利用以前那种偏序集的方法,我们规定一个东西flip[i]:=i~i+k-1的是否需要翻转,如果需要翻转则是1,否则就是0,同时定义背面为1,正面是0
可以看到
∑((i+1)-k+1,i)flip[j]=∑(i-1,i-k+1)flip[j]+flip[i]-flip[i-k+1]
那么我们就可以不断减去两端的方法来求得flip的值了,这是个常数时间,所以复杂度降为O(N^2)
#include <iostream>
#include <algorithm>
#include <functional> using namespace std; static int dir[], if_flip[]; int solve(const int, const int); int main(void)//开关问题
{
int cows_sum, ans_k, ans_step, step;
char tmp;
while (~scanf("%d", &cows_sum))
{
getchar();
for (int i = ; i < cows_sum; i++)
{
scanf("%c", &tmp);
dir[i] = tmp == 'B' ? : ;//0表示前面,1表示后面
getchar();
}
ans_step = cows_sum; ans_k = ;
for (int k = ; k <= cows_sum; k++)
{
step = solve(cows_sum, k);
if (step >= && step < ans_step)
{
ans_step = step;
ans_k = k;
}
}
printf("%d %d\n", ans_k, ans_step);
}
return ;
} int solve(const int cows_sum,const int k)
{
//flip[i]:=i~i+k-1是否进行了翻转,翻转了就是1,否则就是0
int sum = , i, ans_step = ; memset(if_flip, , sizeof(if_flip));
for (i = ; i <= cows_sum - k; i++)
{
if ((dir[i] + sum) % == )//表明经过一系列翻转(如存在)还是背面朝上,则继续翻转
{
ans_step++;
if_flip[i] = ;
}
sum += if_flip[i];
if (i - k + >= )//注意这里是i-k+1!
sum -= if_flip[i - k + ];
}
for (; i < cows_sum; i++)//检查,剩下的段是不能翻转了(小于k了,所以只用检查一下符不符合规则就好)
{
if ((dir[i] + sum) % == )//说明还是有朝上的,说明这样的k是不行的
{
ans_step = -;
break;
}
else if (i - k + >= )//注意这里是i-k+1!
sum -= if_flip[i - k + ];
}
return ans_step;
}

Enum:Face The Right Way(POJ 3276)的更多相关文章
- 反转(开关问题) POJ 3276
POJ 3276 题意:n头牛站成线,有朝前有朝后的的,然后每次可以选择大小为k的区间里的牛全部转向,会有一个最小操作m次使得它们全部面朝前方.问:求最小操作m,再此基础上求k. 题解:1.5000头 ...
- POJ 3276 (开关问题)
题目链接: http://poj.org/problem?id=3276 题目大意:有一些牛,头要么朝前要么朝后,现在要求确定一个连续反转牛头的区间K,使得所有牛都朝前,且反转次数m尽可能小. 解题思 ...
- poj 3276(反转)
传送门:Problem 3276 参考资料: [1]:挑战程序设计竞赛 先献上AC代码,题解晚上再补 题意: John有N头牛,这些牛有的头朝前("F"),有的朝后("B ...
- POJ 3276 Face The Right Way 反转
大致题意:有n头牛,有些牛朝正面,有些牛朝背面.现在你能一次性反转k头牛(区间[i,i+k-1]),求使所有的牛都朝前的最小的反转次数,以及此时最小的k值. 首先,区间反转的顺序对结果没有影响,并且, ...
- POJ 3276
Face The Right Way Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 2193 Accepted: 103 ...
- Face The Right Way 一道不错的尺取法和标记法题目。 poj 3276
Face The Right Way Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 2899 Accepted: 133 ...
- POJ 3276 Face The Right Way 翻转(开关问题)
题目:Click here 题意:n头牛排成一列,F表示牛面朝前方,B表示面朝后方,每次转向K头连续的牛的朝向,求让所有的牛都能面向前方需要的最少的操作次数M和对应的最小的K. 分析:一个区间反转偶数 ...
- POJ 3276 Face The Right Way
Description Farmer John has arranged his N (1 ≤ N ≤ 5,000) cows in a row and many of them are facing ...
- POJ 3276 Face The Right Way(前缀和优化)
题意:有长度为N的01串,有一个操作可以选择连续K个数字取反,求最小的操作数和最小的K使得最后变成全1串.(N<=5000) 由于K是不定的,无法高斯消元. 考虑枚举K,求出最小的操作数. 显然 ...
随机推荐
- solr6.1-----mysql 数据导入-查询
此部分一定要细心,lz 中间错了一个细节,调了好长时间(汗).请严格按照步骤操作 新建core 步骤1: 在webapps中solrhome下新建一个文件夹名字叫做collection1(名字不固定, ...
- jquery Ajax跨域调用WebServices方法
由于公司需要开发一个手机页面,想提供给同事直接在手机上可以查询SAP资料.数据需要使用js调用webserver来获取. 因为初次使用Jquery调用Webserver,所以期间并不顺利.测试调用We ...
- 【PHP面向对象(OOP)编程入门教程】16.__toString()方法
我们前面说过在类里面声明“__”开始的方法名的方法(PHP给我们提供的),都是在某一时刻不同情况下自动调用执行的方 法,“__toString()”方法也是一样自动被调用的,是在直接输出对象引用时自动 ...
- PHP get_class_methods函数用法
get_class_methods — 返回由类的方法名组成的数组 说明 array get_class_methods ( mixed $class_name ) 返回由 class_name 指定 ...
- Mac Pro 使用 ll、la、l等ls的别名命令
在 Linux 下习惯使用 ll.la.l 等ls别名的童鞋到 mac os 可就郁闷了~~ 其实只要在用户目录下建立一个脚本“.bash_profile”, vim .bash_profile 并输 ...
- Mac os壁纸提取
想必用过Mac os系统的朋友都知道mac壁纸,提取出来用作壁纸是十分好看的 下面给出壁纸的位置,自己用文件管理器打开然后复制出来即可! 系统盘:/Library/DesktopPictures
- FineUI第十一天---布局概述
布局概述 1.填充整个页面: 让整个容器填充整个页面,设置PageManager的AutoSizePanelID为需要填充整个页面的容器控件ID. 2. 填充整个容器(Fit): 让一个控件填满另一个 ...
- css position:absolute 如何居中对齐
写死宽度,就好弄了 position: absolute;left: 50%;width: 980px;margin-left: -490px; text-algin:center
- h5的特点
关于HTML面试题汇总之H5 一.H5有哪些新特性,移除了哪些元素?如何处理h5新标签的浏览器兼容性问题,如何区分html和html5 1. html5不在是SGL(通用标记语言)的一个子集,而包 ...
- 他们在军训,我在搞 OI(Ending)
Day 7 上午看看数学书,老师让我把导数相关的概念学了.这也没有多高大上,就是一坨公式需要背,什么 (a)' = 0 啦,什么 (xn)' = n·xn-1 啦,什么 sin'(x) = cos(x ...