POJ 3276 Face The Right Way (常用技巧-尺取法)

【题目链接】:click here~~

【题目大意】:N头牛排成一列1<=N<=5000。每头牛或者向前或者向后。为了让所有牛都 面向前方,农夫每次可以将K头连续的牛转向1<=K<=N,求操作的最少 次数M和对应的最小K。

【思路】:由于交换区间翻转顺序对结果没影响,所以从左往右对于需要  翻转的牛进行反转,同时记录对该区间其他牛的影响即cal中的sum, 对于最后部分无法翻转的区间检查是否有反向牛,若有则方案失败。此题思想值得细细思考,常常有一种无限状态,化为有限状态。

代码:

/**************
*POJ 3276 (尺取法)
*Face The Right Way
*
**************/
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;

const int N=5005;
int t,n,m;
int f[N]; //翻转状态,1翻转,0不翻转
int dir[N]; // 输入状态 F<>0 B<>1
char op[2];

int calc(int k){ //枚举k ,翻转顺序从左到右
    memset(f,0,sizeof(f));
    int i,res=0;   // 连续翻转的次数
    int sum=0;
    for(i=0; i+k<=n; ++i){
        if((dir[i]+sum)&1){ //翻转奇数次改变状态,偶数次不改变
            res++;
            f[i]=1;
        }
        sum+=f[i];  //尺取法
        if(i-k+1>=0) sum-=f[i-k+1];
    }
    for(; i<n; ++i){//判断剩下的是否有反向牛
        if((dir[i]+sum)&1) return -1;
        else if(i-k+1>=0) sum-=f[i-k+1];
    }
    return res;
}

void solve(){
    int K=1,M=n;
    for(int i=1; i<=n; ++i){
        int m=calc(i);
        if(m>0&&m<M){
            M=m;
            K=i;
        }
    }
    printf("%d %d\n",K,M);
}

int main(){
    while(scanf("%d",&n)!=EOF){
        for(int i=0; i<n; ++i){
            scanf("%s",op);
            if(op[0]=='F') dir[i]=0;
            else dir[i]=1;
        }
        solve();
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 15:13:49

POJ 3276 Face The Right Way (常用技巧-尺取法)的相关文章

【POJ 3320】Jessica&#39;s Reading Problemc(尺取法)

题 题意 P个数,求最短的一段包含P个数里所有出现过的数的区间. 分析 尺取法,边读边记录每个数出现次数num[d[i]],和不同数字个数n个. 尺取时,l和r 代表区间两边,每次r++时,d[r]知识点出现次数+1,d[l]知识点出现次数大于1时,次数--,l++,直到d[l]出现次数为1,当不同知识点数量达到n,且区间更小,就更新答案. 代码 #include <cstdio> #include <map> using namespace std; map <int,in

poj 3320 技巧/尺取法 map标记

Description Jessica's a very lovely girl wooed by lots of boys. Recently she has a problem. The final exam is coming, yet she has spent little time on it. If she wants to pass it, she has to master all ideas included in a very thick text book. The au

Subsequence poj 3061 二分(nlog n)或尺取法(n)

Subsequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9236   Accepted: 3701 Description A sequence of N positive integers (10 < N < 100 000), each of them less than or equal 10000, and a positive integer S (S < 100 000 000) are

poj 2739 Sum of Consecutive Prime Numbers(尺取法)

Description Some positive integers can be represented by a sum of one or more consecutive prime numbers. How many such representations does a given positive integer have? For example, the integer 53 has two representations 5 + 7 + 11 + 13 + 17 and 53

《挑战程序设计竞赛》课后练习题解集——3.2 常用技巧精选(一)

常用技巧精选(一) 尺取法 POJ 2566  给出一个长度n(<=1e5)的数列,每个数的大小在-1e4-1e4之间,给出若干询问值,要求一段字串和,它的绝对值与询问值最接近 好题目.由于数列有正有负,所以不能直接二分或尺取.考虑对前缀和排序 得到一个新数列,此时新数列任意一段子串都对应原数列的一个子串,当左右端点的下标颠倒时,字串和也会添一个负号,但是最后要取绝对值所以可以忽略.最后对新数列尺取即可 1 #include <algorithm> 2 #include <cstd

HTML5-移动开发常用技巧与弹性布局的使用

一.移动开发常用技巧 Viewport基本知识 设置布局Viewport的各种信息 1.width=device-width: 设置Viewport视口宽度等于设备宽度 2.initial-scale=1: 网页默认缩放比为1(网页在手持设备上,不会进行默认缩放 3.minimum-scale=1 网页最小缩放比为1 4.maximum-scale=1 网页最小大缩放比为1 5.user-scalable=no 禁止用户手动缩放网页(ios10+ 的设备失效) 在手机站及响应式网站的制作中,网页

【转】oracle存储过程常用技巧

原文链接 http://www.cnblogs.com/chinafine/archive/2010/07/12/1776102.html 我们在进行pl/sql编程时打交道最多的就是存储过程了.存储过程的结构是非常的简单的,我们在这里除了学习存储过程的基本结构外,还会学习编写存储过程时相关的一些实用的知识.如:游标的处理,异常的处理,集合的选择等等 1.存储过程结构 1.1 第一个存储过程 create or replace procedure proc1( p_para1 varchar2,

.Net常用技巧_导出 Excel 和相关打印设置

Excel.Application myExcel = new Excel.Application();发 表Excel.Workbook workbookData = myExcel.Application.Workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet);Excel.Worksheet xlSheet = (Worksheet)workbookData.Worksheets[1];//取得sheet1 1) 显示当前窗口: xlSheet.

mysql 常用技巧

1.正则使用 比 LIKE 会牺牲很多的系统资源 尽量不要用 正则的语法和JS PHP 差不多 select * from t1 where email REGEXP "@163[,.]com$"; select * from t1 where email like "%@163.com" or email like "%@163,com" 2.REPLACE 函数的使用 UPDATE `v9_zhushou` SET `thumb` = REP