#include<cstdio>
#include<vector>
using namespace std;
int main() {
int segments;
int meetingsToLose;
int runTime;
scanf("%d %d %d\n", &segments, &meetingsToLose, &runTime);
int ones = 0;
int twos = 0;
int threes = 0;
vector<int> duties;
for (int i = 0; i < segments; i++) {
char duty;
scanf("%c", &duty);
duties.push_back(duty - '0');
if (duty - '0' == 1) {
ones++;
}
if (duty - '0' == 2) {
twos++;
}
if (duty - '0' == 3) {
threes++;
}
}
if (ones <= meetingsToLose) {
printf("%d\n", segments - meetingsToLose);
return 0;
}
vector<int> prefixes;
vector<int> twosPrefixes;
vector<int> suffixes;
vector<int> twosSuffixes;
int lostBeforeRun = 0;
int twosBeforeRun = 0;
int lostInRun = 0;
for (int i = 0; i < runTime; i++) {
if (duties[i] < 3) {
lostInRun++;
}
}
int lostAfterRun = 0;
int twosAfterRun = 0;
for (int i = runTime; i < segments; i++) {
if (duties[i] == 1) {
lostAfterRun++;
}
if (duties[i] == 2) {
twosAfterRun++;
}
}
prefixes.push_back(lostBeforeRun + lostInRun);
twosPrefixes.push_back(twosBeforeRun);
suffixes.push_back(lostAfterRun + lostInRun);
twosSuffixes.push_back(twosAfterRun);
for (int i = 1; i <= segments - runTime; i++) {
if (duties[i - 1] == 1) {
lostBeforeRun++;
}
if (duties[i - 1] == 2) {
twosBeforeRun++;
}
if (duties[i - 1] < 3) {
lostInRun--;
}
if (duties[i + runTime - 1] < 3) {
lostInRun++;
}
if (duties[i + runTime - 1] == 1) {
lostAfterRun--;
}
if (duties[i + runTime - 1] == 2) {
twosAfterRun--;
}
prefixes.push_back(lostBeforeRun + lostInRun);
twosPrefixes.push_back(twosBeforeRun);
suffixes.push_back(lostAfterRun + lostInRun);
twosSuffixes.push_back(twosAfterRun);
}
int maxTime = -1;
for (int i = 0; i <= segments - 2 * runTime; i++) {
for (int j = i + runTime + 1; j <= segments - runTime; j++) {
if (prefixes[i] + suffixes[j] <= meetingsToLose) {
int remaining = meetingsToLose - prefixes[i] - suffixes[j];
int time = i + (segments - j - runTime) - twosPrefixes[i] - twosSuffixes[j] + remaining;
if (time > maxTime) {
maxTime = time;
}
}
}
}
printf("%d\n", maxTime);
return 0;
}
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 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | #include<cstdio> #include<vector> using namespace std; int main() { int segments; int meetingsToLose; int runTime; scanf("%d %d %d\n", &segments, &meetingsToLose, &runTime); int ones = 0; int twos = 0; int threes = 0; vector<int> duties; for (int i = 0; i < segments; i++) { char duty; scanf("%c", &duty); duties.push_back(duty - '0'); if (duty - '0' == 1) { ones++; } if (duty - '0' == 2) { twos++; } if (duty - '0' == 3) { threes++; } } if (ones <= meetingsToLose) { printf("%d\n", segments - meetingsToLose); return 0; } vector<int> prefixes; vector<int> twosPrefixes; vector<int> suffixes; vector<int> twosSuffixes; int lostBeforeRun = 0; int twosBeforeRun = 0; int lostInRun = 0; for (int i = 0; i < runTime; i++) { if (duties[i] < 3) { lostInRun++; } } int lostAfterRun = 0; int twosAfterRun = 0; for (int i = runTime; i < segments; i++) { if (duties[i] == 1) { lostAfterRun++; } if (duties[i] == 2) { twosAfterRun++; } } prefixes.push_back(lostBeforeRun + lostInRun); twosPrefixes.push_back(twosBeforeRun); suffixes.push_back(lostAfterRun + lostInRun); twosSuffixes.push_back(twosAfterRun); for (int i = 1; i <= segments - runTime; i++) { if (duties[i - 1] == 1) { lostBeforeRun++; } if (duties[i - 1] == 2) { twosBeforeRun++; } if (duties[i - 1] < 3) { lostInRun--; } if (duties[i + runTime - 1] < 3) { lostInRun++; } if (duties[i + runTime - 1] == 1) { lostAfterRun--; } if (duties[i + runTime - 1] == 2) { twosAfterRun--; } prefixes.push_back(lostBeforeRun + lostInRun); twosPrefixes.push_back(twosBeforeRun); suffixes.push_back(lostAfterRun + lostInRun); twosSuffixes.push_back(twosAfterRun); } int maxTime = -1; for (int i = 0; i <= segments - 2 * runTime; i++) { for (int j = i + runTime + 1; j <= segments - runTime; j++) { if (prefixes[i] + suffixes[j] <= meetingsToLose) { int remaining = meetingsToLose - prefixes[i] - suffixes[j]; int time = i + (segments - j - runTime) - twosPrefixes[i] - twosSuffixes[j] + remaining; if (time > maxTime) { maxTime = time; } } } } printf("%d\n", maxTime); return 0; } |
English