输入包含两行。
第一行输入两个正整数
——墙的长度与小苯允许施法的最大次数。
第二行输入一个长度为
的字符串
,保证
仅由字符
与
组成。
输出一个正整数,表示满足要求的最小
。
5 2 WRWWR
2
小苯可以进行次操作,每次操作的长度必须在
以内。
一种可能的染色方式是:选择再选择
,操作后整面墙都会被染红,可以证明不存在单次操作比
更小的长度。
import java.util.*;
import java.io.*;
public class Main {
static int n, m;
static String s;
public static void main(String[] args) {
try(BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
String[] line = br.readLine().split("\\s+");
n = Integer.parseInt(line[0]);
m = Integer.parseInt(line[1]);
s = br.readLine();
boolean hasW = false;
for (int i = 0; i < s.length(); ++i) {
if (s.charAt(i) == 'W') {
hasW = true;
break;
}
}
if (!hasW) {
System.out.println(0);
return;
}
int left = 1, right = n / m + (n % m) + 1;
while (left < right) {
int mid = left + ((right - left) >> 1);
int i = 0, j = m;
while (i < s.length()) {
if (s.charAt(i) == 'R') {
++i;
} else {
i += mid;
--j;
if (j < 0) {
break;
}
}
}
if (j < 0) {
// k要开大一些
left = mid + 1;
} else {
// k可以继续缩小
right = mid;
}
}
System.out.println(left);
} catch (IOException ie) {}
}
}
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt(), m = in.nextInt(), left = -1, right = n, last = n;
String a = in.next();
// 记录下一个白色块的位置,方便快速搜索
int[] next = new int[n];
for (int i=n-1; i>=0; i--) {
if (a.charAt(i) == 'W') {
last = i;
}
next[i] = last;
}
// 二分查找,区间左开右开(left, right)
while (left + 1 < right) {
int k = left + ((right - left) >> 1);
if (check(next, k, n, m)) {
right = k;
} else {
left = k;
}
}
System.out.println(right);
}
private static boolean check(int[] next, int k, int n, int m) {
int cnt = 0, index = 0;
// next[index]表示从index开始的第一个W的位置
// 每次染色表示位置+k,将所有包含W的染完的次数不超过m即可行
while (index < n && next[index] < n) {
// 找到下一个W的位置
index = next[index];
// 从当前的W块开始,染色k个块,继续检查后续
index += k;
// 染色次数超过m表示方案不可行
cnt++;
if (cnt > m) {
return false;
}
}
return true;
}
}
#include <bits/stdc++.h> using namespace std; #define endl '\n' //#define inf 1e18 typedef long long ll; #define int long long int n, m; string s; bool check(int mid) { vector<int> dp(n + 1, 1e18); dp[0] = 0; for(int i = 1; i <= n; i++) { if(s[i] == 'R') { dp[i] = dp[i - 1]; } else { dp[i] = dp[max(0LL, i - mid)] + 1; } } return dp[n] <= m; } void solve() { cin >> n >> m >> s; s = " " + s; int l = 0, r = n; while(l < r) { int mid = (l + r) >> 1; if(check(mid)) r = mid; else l = mid + 1; } cout << l << endl; } /* 5 2 WRWWR 2 3 1 RRR 3 3 WWW */ signed main () { // init(minp, primes, m); // primes // init(); ios::sync_with_stdio(0); cin.tie(0), cout.tie(0); int _ = 1; // cin >> _; while(_ -- ) { solve(); } return 0; }