POJ 3276 Face The Right Way【枚举】
题意:
N头牛站成一条线,分别朝向前后两个方向,机器可以使连续K头牛同时改变方向,要求所有牛最终朝向前方,问机器操作次数的最小值及此时的最小K值。
分析:
第一眼看感觉是二分搜索K,再仔细读题,
please help him determine the minimum value of K that minimizes the number of operations required by the machine to make all the cows face forward.
是在最小操作的基础上的最小K值,而操作数可达2N个,肯定不能搜索状态了,可以对K进行枚举,算出每次的操作数,进行比较。
直接暴力的话时间复杂度O(n3)过不了,必须进行优化,尽量扫描一遍就获得操作数。
因为是K个连续的一起转,即第i到i+k−1号牛要一起转,由于这次转动是由第i号牛引起的,就把这次转动体现在a[i]上,令a[i]=1,那么在遍历到第i+k−1号牛之前,i+k−1号牛所转动的次数就是∑i+k−2ia[i],遍历到第i+k−1号牛时,根据求出的转动次数及他本身的方向,判断是否需要转动,依次处理下去。最后判断剩余k−1头牛是否全部面向前方。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<map>
using namespace std;
const int maxn = 5005, INF =0x3fffffff;
int s[maxn],a[maxn];
int N;
int judge(int k)
{
memset(a, 0, sizeof(a));
int cnt = 0;
int sum = 0;
for(int i = 0; i < N - k + 1; i++){
if((s[i] + sum) % 2 == 1){
a[i] = 1;
cnt++;
}
sum += a[i];
if(i-k+1>=0) sum -= a[i-k+1];
}
for(int i = N - k +1; i < N; i++){
if((s[i] + sum) % 2 == 1){
return -1;
}
if(i-k+1>=0) sum -= a[i-k+1];
}
return cnt;
}
int main (void)
{
map<char,int>m;
m.insert(make_pair('B',1));
m.insert(make_pair('F',0));
scanf("%d", &N);
char c;
for(int i = 0; i < N;i++){
getchar();
c = getchar();
s[i] = m[c];
}
int res = INF, k;
for(int i = 1; i <= N;i++){
int ans = judge(i);
if(ans == -1) continue;
else if(ans < res){
res = ans;
k = i;
}
}
printf("%d %d\n", k, res);
}
POJ 3276 Face The Right Way【枚举】的更多相关文章
- 反转(开关问题) POJ 3276
POJ 3276 题意:n头牛站成线,有朝前有朝后的的,然后每次可以选择大小为k的区间里的牛全部转向,会有一个最小操作m次使得它们全部面朝前方.问:求最小操作m,再此基础上求k. 题解:1.5000头 ...
- POJ.3279 Fliptile (搜索+二进制枚举+开关问题)
POJ.3279 Fliptile (搜索+二进制枚举+开关问题) 题意分析 题意大概就是给出一个map,由01组成,每次可以选取按其中某一个位置,按此位置之后,此位置及其直接相连(上下左右)的位置( ...
- POJ 3276 枚举+差分?
题意: 思路: 先枚举一下k 贪心:如果当前是B那么就翻 差分一下序列 mod2 就OK了 //By SiriusRen #include <cstdio> #include <cs ...
- POJ 3276 (开关问题)
题目链接: http://poj.org/problem?id=3276 题目大意:有一些牛,头要么朝前要么朝后,现在要求确定一个连续反转牛头的区间K,使得所有牛都朝前,且反转次数m尽可能小. 解题思 ...
- Poj(3522),UVa(1395),枚举生成树
题目链接:http://poj.org/problem?id=3522 Slim Span Time Limit: 5000MS Memory Limit: 65536K Total Submis ...
- poj 3740 Easy Finding 二进制压缩枚举dfs 与 DLX模板详细解析
题目链接:http://poj.org/problem?id=3740 题意: 是否从0,1矩阵中选出若干行,使得新的矩阵每一列有且仅有一个1? 原矩阵N*M $ 1<= N <= 16 ...
- POJ 1753 Flip Game(二进制枚举)
题目地址链接:http://poj.org/problem?id=1753 题目大意: 有4*4的正方形,每个格子要么是黑色,要么是白色,当把一个格子的颜色改变(黑->白或者白->黑)时, ...
- POJ 3279 - Fliptile - [状压+暴力枚举]
题目链接:http://poj.org/problem?id=3279 Sample Input 4 4 1 0 0 1 0 1 1 0 0 1 1 0 1 0 0 1 Sample Output 0 ...
- POJ 3977:Subset(折半枚举+二分)
[题目链接] http://poj.org/problem?id=3977 [题目大意] 在n个数(n<36)中选取一些数,使得其和的绝对值最小. [题解] 因为枚举所有数选或者不选,复杂度太高 ...
随机推荐
- vue-router之 beforeRouteEnter
beforeRouteEnter在每次路由切换都执行 ,而项目优化后,切换路由mounted只在最开始执行一次 beforeRouteEnter的具体用法可参考官方文档 https://cn.vuej ...
- 微信官方UI库—WeUI
WeUI 为微信 Web 服务量身设计 概述 WeUI是一套同微信原生视觉体验一致的基础样式库,由微信官方设计团队为微信 Web 开发量身设计,可以令用户的使用感知更加统一.包含button.cell ...
- EditText自动弹出软键盘
editText.requestFocus() editText.isFocusable = true editText.isFocusableInTouchMode = true val timer ...
- 【译】x86程序员手册37-第10章 初始化
Chapter 10 Initialization 第10章 初始化 After a signal on the RESET pin, certain registers of the 80386 a ...
- Youtube-dl 简短使用总结
默认下载bestvideo+bestaudio,并通过ffmpeg -c copy output.mp4 简单的封装进mp4格式,而不进行转码. 有时候bestaudio 是opus编码的,但是mp4 ...
- CentOS 7 挂载ntfs磁盘格式的U盘
因为CentOS 默认不识别NTFS的磁盘格式,所以我们要借助另外一个软件来挂载,那就是ntfs-3g了 自带的yum源没有这个软件,要用第三方的软件源,这里我用的是阿里的epel. 1. 切换到系统 ...
- Python_高阶函数、装饰器(decorator)
一.变量: Python支持多种数据类型,在计算机内部,可以把任何数据都看成一个“对象”,而变量就是在程序中用来指向这些数据对象的,对变量赋值就是把数据和变量给关联起来. 对变量赋值x = y是把变量 ...
- Python2和Python3除法
Python2和Python3除法 Python2除法:/,//,% "/":整数相除,向下取整:浮点数相除,结果包含小数(类似1/2,想保留小数应该写成1.0/2或者1*1. ...
- 计算机内存数据存储基本原理----寄存器和RAM的电路基础
计算机里存储数据主要有这几个部件:CPU里的寄存器和缓存.内存(内存条)和磁盘,这里我们主要简单讲下寄存器和内存条的基础实现电路. 在前面的文章<CPU怎么计算1+1----CPU计算的电路基础 ...
- webpack4前端工程化教程(一)
-本文作为webpack小白入门文章,会详细地介绍webpack的用途.具体的安装步骤.注意事项.一些基本的配置项,并且会以一个具体的项目实例来介绍如何使用webpack.另外,本文会简单地介绍一些最 ...