#include <algorithm>
#include <cstdio>
#define W (data[0])
#define M (data[1])
#define F (data[2])
int n, k, t;
int data[3][8001];
int Σ(const int* X, int y, int z) {
return (y <= z) ? X[z] - X[y-1] : 0;
}
int oblicz() {
if (W[n] <= k) {
// nie musimy jechać do pracy
return std::min(n, F[n] + k);
}
// musimy jechać do pracy
int best = -1;
for (int a=1; a<=n; ++a) {
// wyjeżdżamy do pracy w jednostce a
int min_b = a + 2*t - 1;
for (int b=min_b; b<=n; ++b) {
// wróciliśmy z pracy w jednostce b
// liczymy ile pominęliśmy spotkań w wersji minimum
int ilePominelismy = Σ(W,1,a+t-1) + Σ(W,b-t+1,n)
+ Σ(M,a,a+t-1) + Σ(M,b-t+1,b);
if (ilePominelismy <= k) {
int surplus = k - ilePominelismy;
// jest OK, możemy jeszcze pominąć dodatkowe spotkania
int ileDoPominiecia = Σ(M,1,a-1) + Σ(M,b+1,n);
// a tutaj liczymy ile mamy czasu wolnego
int ileWolnego = Σ(F,1,a-1) + Σ(F,b+1,n)
+ Σ(W,1,a-1) + Σ(W,b+1,n)
+ std::min(surplus, ileDoPominiecia);
best = std::max(best, ileWolnego);
}
}
}
return best;
}
int main() {
scanf("%d %d %d\n", &n, &k, &t);
W[0] = M[0] = F[0] = 0;
for (int i=1; i<=n; ++i) {
char c = getchar();
W[i] = W[i-1];
M[i] = M[i-1];
F[i] = F[i-1];
data[c-'1'][i]++;
}
printf("%d\n", oblicz());
}
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 | #include <algorithm> #include <cstdio> #define W (data[0]) #define M (data[1]) #define F (data[2]) int n, k, t; int data[3][8001]; int Σ(const int* X, int y, int z) { return (y <= z) ? X[z] - X[y-1] : 0; } int oblicz() { if (W[n] <= k) { // nie musimy jechać do pracy return std::min(n, F[n] + k); } // musimy jechać do pracy int best = -1; for (int a=1; a<=n; ++a) { // wyjeżdżamy do pracy w jednostce a int min_b = a + 2*t - 1; for (int b=min_b; b<=n; ++b) { // wróciliśmy z pracy w jednostce b // liczymy ile pominęliśmy spotkań w wersji minimum int ilePominelismy = Σ(W,1,a+t-1) + Σ(W,b-t+1,n) + Σ(M,a,a+t-1) + Σ(M,b-t+1,b); if (ilePominelismy <= k) { int surplus = k - ilePominelismy; // jest OK, możemy jeszcze pominąć dodatkowe spotkania int ileDoPominiecia = Σ(M,1,a-1) + Σ(M,b+1,n); // a tutaj liczymy ile mamy czasu wolnego int ileWolnego = Σ(F,1,a-1) + Σ(F,b+1,n) + Σ(W,1,a-1) + Σ(W,b+1,n) + std::min(surplus, ileDoPominiecia); best = std::max(best, ileWolnego); } } } return best; } int main() { scanf("%d %d %d\n", &n, &k, &t); W[0] = M[0] = F[0] = 0; for (int i=1; i<=n; ++i) { char c = getchar(); W[i] = W[i-1]; M[i] = M[i-1]; F[i] = F[i-1]; data[c-'1'][i]++; } printf("%d\n", oblicz()); } |
English