#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); } |