#include <bits/stdc++.h> using namespace std; vector <int> zdalne,stacjonarne,wolne; int main(){ ios_base::sync_with_stdio(false); cin.tie(0); int n,k,t; char c; int skip_stacjonarne; int skip_zdalne; int skip_zdalne_moze; int potencjalne_wolne; cin >> n >> k >> t; stacjonarne.resize(n+1); zdalne.resize(n+1); wolne.resize(n+1); for( int i = 1; i <= n ; i++ ){ cin >> c; if ( c == '1' ){ stacjonarne[i]++; } else if( c == '2' ){ zdalne[i]++; } else{ wolne[i]++; } } for( int i = 1; i <= n ; i++ ){ stacjonarne[i] += stacjonarne[i-1]; zdalne[i] += zdalne[i-1]; wolne[i] += wolne[i-1]; } int wynik = -1; for ( int i = 1; i <= n-2*t+1; i++ ){// sprawdzic zakresy for ( int j = i+2*t-1; j <= n; j++ ){ skip_stacjonarne = stacjonarne[i+t-1] + (stacjonarne[n] - stacjonarne[j-t]); skip_zdalne = zdalne[i+t-1] - zdalne[i-1] + (zdalne[j] - zdalne[j-t]); skip_zdalne_moze = zdalne[i-1] + zdalne[n] - zdalne[j]; potencjalne_wolne = wolne[i-1] + (wolne[n] - wolne[j]) + stacjonarne[i-1] + (stacjonarne[n] - stacjonarne[j]); if ( skip_stacjonarne + skip_zdalne <= k ){// czy da sie opuscic co najwyzej k spotkan wynik = max( wynik, potencjalne_wolne + min( skip_zdalne_moze , (k - (skip_stacjonarne + skip_zdalne) ) ) ); } } } skip_stacjonarne = stacjonarne[n]; skip_zdalne = 0; skip_zdalne_moze = zdalne[n]; potencjalne_wolne = wolne[n] + stacjonarne[n]; //cout << skip_stacjonarne <<" "<<skip_zdalne <<" "<< skip_zdalne_moze << endl; if ( skip_stacjonarne + skip_zdalne <= k ){// czy da sie opuscic co najwyzej k spotkan wynik = max( wynik, potencjalne_wolne + min( skip_zdalne_moze , (k - (skip_stacjonarne + skip_zdalne) ) ) ); } cout << wynik << '\n'; // moze nie jechac trzeba sprawdzic 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 | #include <bits/stdc++.h> using namespace std; vector <int> zdalne,stacjonarne,wolne; int main(){ ios_base::sync_with_stdio(false); cin.tie(0); int n,k,t; char c; int skip_stacjonarne; int skip_zdalne; int skip_zdalne_moze; int potencjalne_wolne; cin >> n >> k >> t; stacjonarne.resize(n+1); zdalne.resize(n+1); wolne.resize(n+1); for( int i = 1; i <= n ; i++ ){ cin >> c; if ( c == '1' ){ stacjonarne[i]++; } else if( c == '2' ){ zdalne[i]++; } else{ wolne[i]++; } } for( int i = 1; i <= n ; i++ ){ stacjonarne[i] += stacjonarne[i-1]; zdalne[i] += zdalne[i-1]; wolne[i] += wolne[i-1]; } int wynik = -1; for ( int i = 1; i <= n-2*t+1; i++ ){// sprawdzic zakresy for ( int j = i+2*t-1; j <= n; j++ ){ skip_stacjonarne = stacjonarne[i+t-1] + (stacjonarne[n] - stacjonarne[j-t]); skip_zdalne = zdalne[i+t-1] - zdalne[i-1] + (zdalne[j] - zdalne[j-t]); skip_zdalne_moze = zdalne[i-1] + zdalne[n] - zdalne[j]; potencjalne_wolne = wolne[i-1] + (wolne[n] - wolne[j]) + stacjonarne[i-1] + (stacjonarne[n] - stacjonarne[j]); if ( skip_stacjonarne + skip_zdalne <= k ){// czy da sie opuscic co najwyzej k spotkan wynik = max( wynik, potencjalne_wolne + min( skip_zdalne_moze , (k - (skip_stacjonarne + skip_zdalne) ) ) ); } } } skip_stacjonarne = stacjonarne[n]; skip_zdalne = 0; skip_zdalne_moze = zdalne[n]; potencjalne_wolne = wolne[n] + stacjonarne[n]; //cout << skip_stacjonarne <<" "<<skip_zdalne <<" "<< skip_zdalne_moze << endl; if ( skip_stacjonarne + skip_zdalne <= k ){// czy da sie opuscic co najwyzej k spotkan wynik = max( wynik, potencjalne_wolne + min( skip_zdalne_moze , (k - (skip_stacjonarne + skip_zdalne) ) ) ); } cout << wynik << '\n'; // moze nie jechac trzeba sprawdzic return 0; } |