BZOJ 1704: [Usaco2007 Mar]Face The Right Way 自动转身机( 贪心 )

贪心...先枚举k, 然后从左往右扫一遍, 发现位置p的牛的状态不符合就将 [p, p + k ) 的牛都转身, 假如p + k - 1 已经超过了最右边牛的位置那这个k就不符合要求. 符合要求的就可以用来更新answer.这个贪心的正确性是很显然的.前p - 1头牛都已朝前, 再改动它们也做不到更优; 而要让第p头牛转身, 那就只能让[p, p + k )的牛转身.

考虑如何判断位置p的牛的状态, 我们发现p的状态与它本身和[ p - k - 1, p )这个区间内的牛的转身次数有关, 因为转身两次相当于没转, 用异或进行操作可以做到O(1). 枚举O(n), 扫描O(n), 总时间复杂度为O(n²)

-------------------------------------------------------------------

#include<cstdio>

#include<cstring>

#include<algorithm>

#include<iostream>

#define rep(i, n) for(int i = 0; i < n; i++)

#define clr(x, c) memset(x, c, sizeof(x))

using namespace std;

const int maxn = 5009;

const int inf = 1000000000;

int A[maxn], n, H[maxn];

int main() {

freopen("test.in", "r", stdin);

cin >> n;

rep(i, n) {

char c;

scanf(" %c", &c);

A[i] = c == ‘F‘ ? 0 : 1;

}

int ans[2] = {0, inf};// {k, m}

for(int i = 1; i <= n; i++) {

clr(H, 0);

int cnt = 0, p = 0;

rep(j, n) {

if(j >= i) p ^= H[j - i];

if(i + j > n) {

if(A[j] ^ p) cnt = inf;

continue;

}

if(A[j] ^ p)

cnt++, H[j] ^= 1;

p ^= H[j];

}

if(ans[1] > cnt)

ans[0] = i, ans[1] = cnt;

}

cout << *ans << ‘ ‘ << ans[1] << "\n";

return 0;

}

-------------------------------------------------------------------

1704: [Usaco2007 Mar]Face The Right Way 自动转身机

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 313  Solved: 183
[Submit][Status][Discuss]

Description

农夫约翰有N(1≤N≤5000)只牛站成一排,有一些很乖的牛朝前站着.但是有些不乖的牛却朝后站着.农夫约翰需要让所有的牛都朝前站着.幸运的是约翰最近买了一个自动转身机.这个神奇的机器能使K(1≤K≤N)只连续的牛转身.  因为约翰从来都不改变K的价值,请帮助他求出K,使旋转次数M达到最小.同时要求出对应的M.

Input

第1行:整数N.

第2行到第N+1行:第i+l行表示牛j的朝向,F表示朝前,B表示朝后.

Output

一行两个数,分别是K和M,中间用空格隔开

Sample Input

7
B
B
F
B
F
B
B

INPUT DETAILS:

There are seven cows and they are facing backward, backward, forward,
backward, forward, backward, and backward, respectively.

Sample Output

3 3

OUTPUT DETAILS:

For K = 3, the machine must be operated three times: turn cows (1,2,3),
(3,4,5), and finally (5,6,7):

B > F F F
B > F F F
F > B > F F
B B > F F
F F > B > F
B B B > F
B B B > F

HINT

当K=3时神奇的机器旋转3次:(1,2,3),(3,4,5),和(5,6,7)

Source

Gold

时间: 2024-10-11 06:50:38

BZOJ 1704: [Usaco2007 Mar]Face The Right Way 自动转身机( 贪心 )的相关文章

BZOJ1704: [Usaco2007 Mar]Face The Right Way 自动转身机

n<=5000个数0或1,每次可以连续对固定长度区间取反,目标把所有1变0,求一个取反区间的固定长度K使取反次数最少. 答案关于K不单调,因此枚举K,对每个K扫一遍区间,遇到1就把连续K个数反转,看最后K-1个数是否在这样一番操作后都为0.为什么?不知道. 区间取反后查询,用差分.n2可过. 1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 #include<cstdlib>

[BZOJ] 1639: [Usaco2007 Mar]Monthly Expense 月度开支

1639: [Usaco2007 Mar]Monthly Expense 月度开支 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1077  Solved: 533[Submit][Status][Discuss] Description Farmer John是一个令人惊讶的会计学天才,他已经明白了他可能会花光他的钱,这些钱本来是要维持农场每个月的正常运转的.他已经计算了他以后N(1<=N<=100,000)个工作日中每一天的花费moneyi(1

bzoj 1637: [Usaco2007 Mar]Balanced Lineup

1637: [Usaco2007 Mar]Balanced Lineup Time Limit: 5 Sec  Memory Limit: 64 MB Description Farmer John 决定给他的奶牛们照一张合影,他让 N (1 ≤ N ≤ 50,000) 头奶牛站成一条直线,每头牛都有它的坐标(范围: 0..1,000,000,000)和种族(0或1). 一直以来 Farmer John 总是喜欢做一些非凡的事,当然这次照相也不例外.他只给一部分牛照相,并且这一组牛的阵容必须是"

Bzoj 1703: [Usaco2007 Mar]Ranking the Cows 奶牛排名 传递闭包,bitset

1703: [Usaco2007 Mar]Ranking the Cows 奶牛排名 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 323  Solved: 238[Submit][Status][Discuss] Description 农夫约翰有N(1≤N≤1000)头奶牛,每一头奶牛都有一个确定的独一无二的正整数产奶率.约翰想要让这些奶牛按产奶率从高到低排序.    约翰已经比较了M(1≤M≤10000)对奶牛的产奶率,但他发现,他还需要再做一

BZOJ 1637: [Usaco2007 Mar]Balanced Lineup( sort + 前缀和 )

将 0 变为 -1 , 则只需找区间和为 0 , 即前缀和相同的最长区间 , 记录一下每个前缀和出现的最早和最晚的位置 , 比较一下就 OK 了 ------------------------------------------------------------------------------------------- #include<cstdio> #include<algorithm> #include<cstring> #include<iostr

BZOJ 1639: [Usaco2007 Mar]Monthly Expense 月度开支( 二分答案 )

直接二分答案然后判断. ----------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #define rep( i , n ) for( int i = 0 ;  i < n ; ++i ) #define clr

BZOJ 1703 [Usaco2007 Mar]Ranking the Cows 奶牛排名 bitset优化

题意:链接 方法: bitset传递闭包 解析: 显然答案为无序点对的个数. 但是无序点对的个数怎么求呢? 容斥原理. 所有点对个数减去有序点对的个数即为答案. 怎么维护有序点对个数呢? bitset传递闭包即可. 人生中的第一次rnk1!!!!!!!!!!! 代码: #include <bitset> #include <cstdio> #include <cstring> #include <iostream> #include <algorith

bzoj 1638: [Usaco2007 Mar]Cow Traffic 奶牛交通【记忆化搜索】

震惊!记忆化搜索忘记返回map值调了半小时! 边(u,v)的经过次数是:能到u的牛数*v到n的方案数.正反两次连边,dfs两次即可 #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N=5005,M=50005; int n,m,x[M],y[M],h[N],cnt,ans,f[N],g[N]; struct qwe { int ne,to; }e[M

bzoj 1702: [Usaco2007 Mar]Gold Balanced Lineup 平衡的队列【hash】

我%&&--&()&%????? 双模hashWA,unsigned long longAC,而且必须判断hash出来的数不能为0???? 我可能学了假的hash 这个题求个前缀和,然后目标是找到距离当前位置最远,且能使这两个数组差分后2-k位相同 hash把差分后数组的2到k位压起来即可,用map存这个hash值最早出现的位置 但是我还是不明白为啥hash值不能为0啊?? #include<iostream> #include<cstdio> #i