luogu P2882 [USACO07MAR]Face The Right Way G
题目描述
Farmer John has arranged his N (1 ≤ N ≤ 5,000) cows in a row and many of them are facing forward, like good cows. Some of them are facing backward, though, and he needs them all to face forward to make his life perfect.
Fortunately, FJ recently bought an automatic cow turning machine. Since he purchased the discount model, it must be irrevocably preset to turn K (1 ≤ K ≤ N) cows at once, and it can only turn cows that are all standing next to each other in line. Each time the machine is used, it reverses the facing direction of a contiguous group of K cows in the line (one cannot use it on fewer than K cows, e.g., at the either end of the line of cows). Each cow remains in the same *location* as before, but ends up facing the *opposite direction*. A cow that starts out facing forward will be turned backward by the machine and vice-versa.
Because FJ must pick a single, never-changing value of 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. Also determine M, the minimum number of machine operations required to get all the cows facing forward using that value of K.
\(N\) 头牛排成一列 \(1 \le N \le 5000\)。每头牛或者向前或者向后。为了让所有牛都面向前方,农夫每次可以将 \(K\) 头连续的牛转向 \(1 \le K \le N\),求使操作次数最小的相应 \(K\) 和最小的操作次数 \(M\)。\(F\) 为朝前,\(B\) 为朝后。
请在一行输出两个数字 \(K\) 和 \(M\),用空格分开。
输入格式
Line 1: A single integer: N
Lines 2..N+1: Line i+1 contains a single character, F or B, indicating whether cow i is facing forward or backward.
输出格式
Line 1: Two space-separated integers: K and M
样例 #1
样例输入 #1
7
B
B
F
B
F
B
B
样例输出 #1
3 3
提示
For K = 3, the machine must be operated three times: turn cows (1,2,3), (3,4,5), and finally (5,6,7)
分析
这道题的思想跟acwing 95.费解的开关有点像。
就是按照顺序遍历一遍, 前面的状态已经确定,后状态的改变就不会对前面产生影响。
那么只要先枚举一遍修改区间的长度,遍历数组,遇到 0 就改变后面一定长度的区间。如果说要改变的地方超过了数组总长度,这个方案就是不行的。枚举长度+遍历数组+修改,时间复杂度\(O(n^3)\) n = 5000,显然需要优化。枚举长度和遍历数组不好优化,修改的话优化方法较多,比如差分,树状数组啥的。
差分只要修改两个点,就可以将两点间的区间修改,但是求值又是\(O(n)\),但是这题也不需要求值,实际上看题解感觉这差分数组跟标记数组差不多。
颠倒两次相当于没变(虽然众所周知,还是有提的必要)
#include<iostream>
#include<cstring>
using namespace std;
#define N 5010
bool cha[N];
int n, a[N];
int now, ans1 = 0x3f3f3f3f, ans2, tot;
char ch;
int main()
{
cin >> n;
for(int i = 1; i <= n; i ++)
{
cin >> ch;
if(ch == 'F')
a[i] = 1;
}
for(int k = 1; k <= n; k ++)//遍历区间长度
{
memset(cha, 0, sizeof(cha));
int flag = 1, tot = 0, now = 0;//now表示这一段区域是否翻转
for(int i = 1; i <= n; i ++)
{
now ^= cha[i];//遇到变化区间的末尾时,再变回来
if(a[i] ^ now == 0)
{
if(i + k - 1 > n)//超出范围
{
flag = 0;
break;
}
tot ++;
cha[i + k] ^= 1;
now ^= 1;
}
}
if(flag == 1)
{
if(tot < ans1)//记录一下再少变化数量
{
ans1 = tot;
ans2 = k;
}
}
}
cout << ans2 << " " << ans1 << endl;
return 0;
}
luogu P2882 [USACO07MAR]Face The Right Way G的更多相关文章
- 洛谷 P2882 [USACO07MAR]Face The Right Way G
题目传送门 题目描述 Farmer John has arranged his N (1 ≤ N ≤ 5,000) cows in a row and many of them are facing ...
- [USACO07MAR]Face The Right Way G
发现选定一个长度后,怎么翻转是固定的. 那我们直接选定一个长度去操作就行. 优化操作过程 类似于堆里打持久化标记一样的感觉. [USACO07MAR]Face The Right Way G // P ...
- bzoj1704 / P2882 [USACO07MAR]面对正确的方式Face The Right Way
P2882 [USACO07MAR]面对正确的方式Face The Right Way $n<=5000$?枚举翻转长度,顺序模拟就ok了 对于每次翻转,我们可以利用差分的思想,再搞搞前缀和. ...
- USACO07MAR Face The Right Way G 差分
题目链接 https://www.luogu.com.cn/problem/P2882 分析 这个题来看的话好像有点难下手,不如再去读一遍题 N遍,发现一句话很重要Each time the mach ...
- 洛谷P2882 [USACO07MAR]面对正确的方式Face The Right Way(贪心)
题目描述 Farmer John has arranged his N (1 ≤ N ≤ 5,000) cows in a row and many of them are facing forwar ...
- luogu P2973 [USACO10HOL]Driving Out the Piggies G 驱逐猪猡
luogu LINK:驱逐猪猡 bzoj LINK:猪猪快跑 问题是在1时刻有个炸蛋在1号点 这个炸弹有p/q的概率爆炸 如果没有爆炸 那么会有1/di的概率选择一条边跳到另外一个点上重复这个过程. ...
- P2882 [USACO07MAR]Face The Right Way [贪心+模拟]
题目描述 N头牛排成一列1<=N<=5000.每头牛或者向前或者向后.为了让所有牛都 面向前方,农夫每次可以将K头连续的牛转向1<=K<=N,求操作的最少 次数M和对应的最小K ...
- 『题解』洛谷P2296 寻找道路
更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Description 在有向图\(\mathrm G\)中,每条边的长度均为\(1\),现给定起点和终点 ...
- Storyboards Tutorial 03
这一节主要介绍segues,static table view cells 和 Add Player screen 以及 a game picker screen. Introducing Segue ...
随机推荐
- 使用node.js如何简单快速的搭建一个websocket聊天应用
初始化项目 npm init 安装nodejs-websocket npm install nodejs-websocket 创建并编辑启动文件 创建一个名为app.js文件,并且编辑它. var w ...
- SAP setting and releasing locks
REPORT demo_transaction_enqueue MESSAGE-ID sabapdocu. TABLES sflight. DATA text(8) TYPE c. DATA ok_c ...
- RPA 快手自动上传机器人
1.打开账号Cookie预存表格 2.机器人自动登录账号 3.机器人开始按照预设视频位置开始自动上传视频 4.机器人开始自动填写视频相关信息内容 5.完成后,可自动切换下一个账号继续上传
- 【RPA之家BluePrism手把手教程】2.3 多重计算
2.3.1 添加除法运算计算框 2.3.2 设置除法运算计算属性 2.3.3 程序运行前初始值 2.3.4 程序运行后结果 使用多重计算框实现以上操作 2.3.5 添加多重选择框 2.3.6 设置多重 ...
- Timer和ScheduledThreadPoolExecutor的区别
Timer 基于单线程.系统时间实现的延时.定期任务执行类.具体可以看下面红色标注的代码. public class Timer { /** * The timer task queue. This ...
- 动态树 — Euler_Tour_Tree
一般提到动态树,我们会不约而同的想到 LCT,这算是比较通用,实用,能力较为广泛的一种写法了.当然,掌握 LCT 就需要熟悉掌握 Splay 和各种操作和知识.ETT(中文常用称呼:欧拉游览树)是一种 ...
- 没有Kubernetes怎么玩Dapr?
Dapr 被设计成一个面向开发者的企业级微服务编程平台,它独立于具体的技术平台,可以运行在"任何地方".Dapr本身并不提供"基础设施(infrastructure)&q ...
- sudoer文件配置错误修复
以错误配置权限为例,如果是sudoer文件内容配置错误,替换步骤(4)中相关命令即可 (1)建立两个ssh连接,分别记为A.B (2)A:echo $$获取ID (3)B:pkttyagent --p ...
- Phabricator Conduit API介绍
在Phabricator页面,可以完成创建和编辑Project.Task等操作.但是如果想实现外部系统可以自主操作Phabricator,那么就需要调用Phabricator Conduit API, ...
- SpringCloudAlibaba分布式事务解决方案Seata实战与源码分析-中
事务模式 概述 在当前的技术发展阶段,不存一个分布式事务处理机制可以完美满足所有场景的需求.一致性.可靠性.易用性.性能等诸多方面的系统设计约束,需要用不同的事务处理机制去满足. 目前使用的流行度情况 ...