题目描述

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<=N<=5000。每头牛或者向前或者向后。为了让所有牛都 面向前方,农夫每次可以将K头连续的牛转向1<=K<=N,求操作的对应的最小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:

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)

这道题可以枚举每一种情况,然后O(n)判断是否可行。用all来表示当前的所有操作对这个点所产生的影响,并时刻更新。别忘了最后判断是否已经全部为F。

#include <bits/stdc++.h>
#define int long long
#define For(i, a, b) for (register int i = a; i <= b; i++)
using namespace std;
int n, a[5500], ans, rev[5500], all, tot, mn = 0x3f3f3f3f, mnat;
char ch;
bool ok(int x) {
memset(rev, 0, sizeof rev);
all = 0, tot = 0;
For(i, 1, n - x + 1) {
if ((a[i] + all) % 2 == 1) {
rev[i] = 1;
tot++;
}
all += rev[i];
if (i - x + 1 >= 1)
all -= rev[i - x + 1];
}
if (tot > mn)
return 0;
For(i, n - x + 2, n) {
if ((a[i] + all) % 2 == 1)
return 0;
if (i - x + 1 >= 1)
all -= rev[i - x + 1];
}
return 1;
}
signed main() {
cin >> n;
For(i, 1, n) {
cin >> ch;
a[i] = (ch == 'F' ? 0 : 1);
}
For(i, 1, n) {
if (ok(i) && tot < mn) {
mn = tot;
mnat = i;
}
}
cout << mnat << " " << mn << '\n';
return 0;
}

最新文章

  1. AMD and CMD are dead之Why Namespace?
  2. MVC应用程序实现上传文件
  3. 如何查看,关闭和开启selinux
  4. JVM-class文件完全解析-类索引,父类索引和索引集合
  5. Qt: qobject_cast&lt;QPushButton*&gt;(sender()) 简化信号与槽的编写
  6. iis7 php urlrewrite 并隐藏index.php
  7. margin,padding之我见
  8. Pythonic到底是什么玩意儿?
  9. Python 自动化脚本学习(三)
  10. js 计算两个时间差
  11. hdu1561(树形背包)
  12. permission denied for window type 2003
  13. [HAOI 2007]上升序列
  14. JAVA小记 (1)
  15. 接口自动化:HttpClient + TestNG + Java(五) - 接口测试数据驱动
  16. android 实现点击edittext的“小眼睛”切换明密文
  17. Python 八皇后问题
  18. 团队作业7——第二次项目冲刺(Beta版本)day2
  19. mysql/mariadb学习过程中出现的问题与解决
  20. 解决 sublime text 3 there are no packages available for installation 错误

热门文章

  1. vim常用命令整理
  2. [转帖]B4. Concurrent JVM 锁机制(synchronized)
  3. DBA职业发展之路:去“IOE”等挑战之下,DBA将何去何从?
  4. NETCore使用带有权限验证的Swagger
  5. JS中判断对象是对象还是数组的方法
  6. centos7安装jenkins以及jenkins正常启动无法访问问题
  7. CSS 多列布局
  8. android studio学习----调试---断点调试
  9. HttpURLConnection Get和Post发送数据
  10. 使用ProcDump自动生成Dump文件