#include <iostream> #include <vector> #include <string> using namespace std; void input(int & n, int & k, int & t, string & tasks) { cin >> n >> k >> t; cin >> tasks; } void getPrefSum(string const & tasks, char const tt, vector<int> & prefSum) { prefSum.resize(tasks.size()+1, 0); for(int i = 0; i < tasks.size(); i++) { prefSum[i+1] = prefSum[i]; if(tasks[i] == tt) { prefSum[i+1]++; } } } void solve() { int n, k, t; string tasks; input(n, k, t, tasks); vector<int> prefLoc; vector<int> prefOnl; getPrefSum(tasks, '1', prefLoc); getPrefSum(tasks, '2', prefOnl); int allMeets = prefLoc[n] + prefOnl[n]; int needMeets = 0; if(allMeets >= k) { needMeets = allMeets - k; } if(prefOnl[n] >= needMeets) { cout << n - needMeets << "\n"; return; } int maxRes = -1; for(int i = 0; i <= n - 2 * t; i++) { for(int j = i + t; j <= n - t; j++) { int inMeets = prefLoc[j] - prefLoc[i+t] + prefOnl[j] - prefOnl[i+t]; int outOnlMeets = prefOnl[i] - prefOnl[0] + prefOnl[n] - prefOnl[j+t]; if(inMeets + outOnlMeets < needMeets) { continue; } int outNeedMeets = 0; if(needMeets > inMeets) { outNeedMeets = needMeets - inMeets; } int curRes = n - (j + t - i + outNeedMeets); if(curRes > maxRes) { maxRes = curRes; } } } cout << maxRes << "\n"; return; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); solve(); 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 <iostream> #include <vector> #include <string> using namespace std; void input(int & n, int & k, int & t, string & tasks) { cin >> n >> k >> t; cin >> tasks; } void getPrefSum(string const & tasks, char const tt, vector<int> & prefSum) { prefSum.resize(tasks.size()+1, 0); for(int i = 0; i < tasks.size(); i++) { prefSum[i+1] = prefSum[i]; if(tasks[i] == tt) { prefSum[i+1]++; } } } void solve() { int n, k, t; string tasks; input(n, k, t, tasks); vector<int> prefLoc; vector<int> prefOnl; getPrefSum(tasks, '1', prefLoc); getPrefSum(tasks, '2', prefOnl); int allMeets = prefLoc[n] + prefOnl[n]; int needMeets = 0; if(allMeets >= k) { needMeets = allMeets - k; } if(prefOnl[n] >= needMeets) { cout << n - needMeets << "\n"; return; } int maxRes = -1; for(int i = 0; i <= n - 2 * t; i++) { for(int j = i + t; j <= n - t; j++) { int inMeets = prefLoc[j] - prefLoc[i+t] + prefOnl[j] - prefOnl[i+t]; int outOnlMeets = prefOnl[i] - prefOnl[0] + prefOnl[n] - prefOnl[j+t]; if(inMeets + outOnlMeets < needMeets) { continue; } int outNeedMeets = 0; if(needMeets > inMeets) { outNeedMeets = needMeets - inMeets; } int curRes = n - (j + t - i + outNeedMeets); if(curRes > maxRes) { maxRes = curRes; } } } cout << maxRes << "\n"; return; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); solve(); return 0; } |