#include <iostream>
int calculateMaxValue(char *obowiazki, int n, int t)
{
int liczba3 = 0;
bool liczba1 = false;
int minus = 0;
for (int i = 0; i < n; i++)
{
if (obowiazki[i] == '3')
liczba3++;
if (obowiazki[i] == '1'){
int counter = 0;
for(int j = i; j<i+t+1; j++){
if (obowiazki[j] == '3') counter++;
else if (obowiazki[j] == '2') minus+=counter;
}
for(int j = i; j>i-t-1; j--){
if (obowiazki[j] == '3') counter++;
else if (obowiazki[j] == '2') minus+=counter;
}
liczba1 = true;
}
}
if(liczba1) minus+=t*2;
return liczba3 - minus;
}
void generateCombinations(char *obowiazki, int n, int k, int start, int changes, int t, int &maxValue)
{
if (changes == k)
{
int currentValue = calculateMaxValue(obowiazki, n, t);
maxValue = maxValue < currentValue ? currentValue : maxValue;
return;
}
for (int i = start; i < n; i++)
{
if (obowiazki[i] == '1' || obowiazki[i] == '2')
{
char origynal = obowiazki[i];
obowiazki[i] = '3';
generateCombinations(obowiazki, n, k, i + 1, changes + 1, t, maxValue);
obowiazki[i] = origynal;
}
}
}
int main(){
int n,k,t;
scanf("%d", &n);
scanf("%d", &k);
scanf("%d", &t);
char *obowiazki = new char[n]();
int liczbaObowiazkow = 0;
for(int i = 0; i<n; i++){
scanf(" %c", &obowiazki[i]);
if(obowiazki[i] == '1' || obowiazki[i] == '2') liczbaObowiazkow++;
}
if(liczbaObowiazkow<=k){
printf("%d", n);
return 0;
}
if(k>0){
for(int i = 0; i<t; i++){
if(obowiazki[i] == '1'){
obowiazki[i] = '3';
k--;
liczbaObowiazkow--;
if(0 > k){
printf("-1");
return 0;
}
}
if(obowiazki[n-i-1] == '1'){
obowiazki[n-i-1] = '3';
k--;
liczbaObowiazkow--;
if(0 > k){
printf("-1");
return 0;
}
}
}
}
int maxValue = -1;
generateCombinations(obowiazki, n, k, 0, 0, t, maxValue);
printf("%d", maxValue);
delete[] obowiazki;
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 | #include <iostream> int calculateMaxValue(char *obowiazki, int n, int t) { int liczba3 = 0; bool liczba1 = false; int minus = 0; for (int i = 0; i < n; i++) { if (obowiazki[i] == '3') liczba3++; if (obowiazki[i] == '1'){ int counter = 0; for(int j = i; j<i+t+1; j++){ if (obowiazki[j] == '3') counter++; else if (obowiazki[j] == '2') minus+=counter; } for(int j = i; j>i-t-1; j--){ if (obowiazki[j] == '3') counter++; else if (obowiazki[j] == '2') minus+=counter; } liczba1 = true; } } if(liczba1) minus+=t*2; return liczba3 - minus; } void generateCombinations(char *obowiazki, int n, int k, int start, int changes, int t, int &maxValue) { if (changes == k) { int currentValue = calculateMaxValue(obowiazki, n, t); maxValue = maxValue < currentValue ? currentValue : maxValue; return; } for (int i = start; i < n; i++) { if (obowiazki[i] == '1' || obowiazki[i] == '2') { char origynal = obowiazki[i]; obowiazki[i] = '3'; generateCombinations(obowiazki, n, k, i + 1, changes + 1, t, maxValue); obowiazki[i] = origynal; } } } int main(){ int n,k,t; scanf("%d", &n); scanf("%d", &k); scanf("%d", &t); char *obowiazki = new char[n](); int liczbaObowiazkow = 0; for(int i = 0; i<n; i++){ scanf(" %c", &obowiazki[i]); if(obowiazki[i] == '1' || obowiazki[i] == '2') liczbaObowiazkow++; } if(liczbaObowiazkow<=k){ printf("%d", n); return 0; } if(k>0){ for(int i = 0; i<t; i++){ if(obowiazki[i] == '1'){ obowiazki[i] = '3'; k--; liczbaObowiazkow--; if(0 > k){ printf("-1"); return 0; } } if(obowiazki[n-i-1] == '1'){ obowiazki[n-i-1] = '3'; k--; liczbaObowiazkow--; if(0 > k){ printf("-1"); return 0; } } } } int maxValue = -1; generateCombinations(obowiazki, n, k, 0, 0, t, maxValue); printf("%d", maxValue); delete[] obowiazki; return 0; } |
English