#include<bits/stdc++.h> using namespace std; int spotkan[8100]; int stacjon[8100]; int zdalnych[8100]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, k, t; cin >> n >> k >> t; string slowo; cin >> slowo; for (int i=0; i<n; i++) { if (slowo[i] == '1') { stacjon[i+1] = stacjon[i] + 1; zdalnych[i+1] = zdalnych[i]; } else if (slowo[i] == '2') { stacjon[i+1] = stacjon[i]; zdalnych[i+1] = zdalnych[i] + 1; } else { stacjon[i+1] = stacjon[i]; zdalnych[i+1] = zdalnych[i]; } spotkan[i+1] = stacjon[i+1] + zdalnych[i+1]; } int wynik = -1; // jesli nie pojdzie do pracy if (stacjon[n] <= k) wynik = n - max(0, (spotkan[n] - k)); for (int ind1=0; ind1<=n-t; ind1++) { for (int ind2=ind1+t; ind2<=n-t; ind2++) { //cout << "Wyjeżdża: " << ind1 <<" " << ind2 << endl; // w drodze [ind1, ind1+t-1] oraz [ind2, ind2+t-1] int spotkan_droga = (spotkan[ind1+t] - spotkan[ind1]) + (spotkan[ind2+t] - spotkan[ind2]); // w domu [0, ind1-1] oraz [ind2+t, n-1] int stacjon_dom = stacjon[ind1] + (stacjon[n] - stacjon[ind2+t]); int spotkan_dom = spotkan[ind1] + (spotkan[n] - spotkan[ind2+t]); //cout << "w drodze: " << spotkan_droga << endl; //cout << "w domu: " << spotkan_dom << endl; //cout << "w domu stacjonarnych: " << stacjon_dom << endl; if (spotkan_droga + stacjon_dom > k) continue; int curr_wynik = ind1 + (n - (ind2+t)) - max(0, (spotkan_dom - (k-spotkan_droga))); //cout << "wynik: " << curr_wynik << endl << endl; wynik = max(wynik, curr_wynik); } } cout << wynik << endl; 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 | #include<bits/stdc++.h> using namespace std; int spotkan[8100]; int stacjon[8100]; int zdalnych[8100]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, k, t; cin >> n >> k >> t; string slowo; cin >> slowo; for (int i=0; i<n; i++) { if (slowo[i] == '1') { stacjon[i+1] = stacjon[i] + 1; zdalnych[i+1] = zdalnych[i]; } else if (slowo[i] == '2') { stacjon[i+1] = stacjon[i]; zdalnych[i+1] = zdalnych[i] + 1; } else { stacjon[i+1] = stacjon[i]; zdalnych[i+1] = zdalnych[i]; } spotkan[i+1] = stacjon[i+1] + zdalnych[i+1]; } int wynik = -1; // jesli nie pojdzie do pracy if (stacjon[n] <= k) wynik = n - max(0, (spotkan[n] - k)); for (int ind1=0; ind1<=n-t; ind1++) { for (int ind2=ind1+t; ind2<=n-t; ind2++) { //cout << "Wyjeżdża: " << ind1 <<" " << ind2 << endl; // w drodze [ind1, ind1+t-1] oraz [ind2, ind2+t-1] int spotkan_droga = (spotkan[ind1+t] - spotkan[ind1]) + (spotkan[ind2+t] - spotkan[ind2]); // w domu [0, ind1-1] oraz [ind2+t, n-1] int stacjon_dom = stacjon[ind1] + (stacjon[n] - stacjon[ind2+t]); int spotkan_dom = spotkan[ind1] + (spotkan[n] - spotkan[ind2+t]); //cout << "w drodze: " << spotkan_droga << endl; //cout << "w domu: " << spotkan_dom << endl; //cout << "w domu stacjonarnych: " << stacjon_dom << endl; if (spotkan_droga + stacjon_dom > k) continue; int curr_wynik = ind1 + (n - (ind2+t)) - max(0, (spotkan_dom - (k-spotkan_droga))); //cout << "wynik: " << curr_wynik << endl << endl; wynik = max(wynik, curr_wynik); } } cout << wynik << endl; return 0; } |