#include <cstdio>
const int maxN = 8010;
char S[maxN];
int pref[4][maxN];
const int OFFICE = 1;
const int ONLINE = 2;
const int FREE = 3;
int N, K, T;
int max(int a, int b)
{
return a > b ? a : b;
}
int min(int a, int b)
{
return a < b ? a : b;
}
int count(int X, int a, int b)
{
return pref[X][b + 1] - pref[X][a];
}
int main()
{
scanf("%d%d%d", &N, &K, &T);
scanf("%s", S);
for (int i = 1; i <= N; ++i)
{
pref[FREE][i] = pref[FREE][i - 1] + (S[i - 1] == '0' + FREE);
pref[ONLINE][i] = pref[ONLINE][i - 1] + (S[i - 1] == '0' + ONLINE);
pref[OFFICE][i] = pref[OFFICE][i - 1] + (S[i - 1] == '0' + OFFICE);
}
if (count(OFFICE, 0, N - 1) <= K)
{
K -= count(OFFICE, 0, N - 1);
printf("%d\n", min(N, N - count(ONLINE, 0, N - 1) + K));
return 0;
}
int best = -1;
for (int i = 0; i <= N - 2 * T; ++i)
for (int j = i + T; j <= N - T; ++j)
{
int k = K - (count(OFFICE, 0, i + T - 1) + count(OFFICE, j, N - 1) + count(ONLINE, i, i + T - 1) + count(ONLINE, j, j + T - 1));
if (k >= 0)
{
int res = count(FREE, 0, i - 1) + count(FREE, j + T, N - 1);
res += min(k, count(ONLINE, 0, i - 1) + count(ONLINE, j + T, N - 1));
best = max(best, res);
}
}
printf("%d\n", best);
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | #include <cstdio> const int maxN = 8010; char S[maxN]; int pref[4][maxN]; const int OFFICE = 1; const int ONLINE = 2; const int FREE = 3; int N, K, T; int max(int a, int b) { return a > b ? a : b; } int min(int a, int b) { return a < b ? a : b; } int count(int X, int a, int b) { return pref[X][b + 1] - pref[X][a]; } int main() { scanf("%d%d%d", &N, &K, &T); scanf("%s", S); for (int i = 1; i <= N; ++i) { pref[FREE][i] = pref[FREE][i - 1] + (S[i - 1] == '0' + FREE); pref[ONLINE][i] = pref[ONLINE][i - 1] + (S[i - 1] == '0' + ONLINE); pref[OFFICE][i] = pref[OFFICE][i - 1] + (S[i - 1] == '0' + OFFICE); } if (count(OFFICE, 0, N - 1) <= K) { K -= count(OFFICE, 0, N - 1); printf("%d\n", min(N, N - count(ONLINE, 0, N - 1) + K)); return 0; } int best = -1; for (int i = 0; i <= N - 2 * T; ++i) for (int j = i + T; j <= N - T; ++j) { int k = K - (count(OFFICE, 0, i + T - 1) + count(OFFICE, j, N - 1) + count(ONLINE, i, i + T - 1) + count(ONLINE, j, j + T - 1)); if (k >= 0) { int res = count(FREE, 0, i - 1) + count(FREE, j + T, N - 1); res += min(k, count(ONLINE, 0, i - 1) + count(ONLINE, j + T, N - 1)); best = max(best, res); } } printf("%d\n", best); } |
English