#include <bits/stdc++.h>
using namespace std;
int n, k, t;
string planS;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> n >> k >> t;
cin >> planS;
vector<int> workPrefSum(n + 1);
workPrefSum[0] = 0;
vector<int> hostPrefSum(n + 1);
hostPrefSum[0] = 0;
vector<int> programPrefSum(n + 1);
programPrefSum[0] = 0;
for(int i = 0; i < n; i++)
{
workPrefSum[i + 1] = workPrefSum[i] + ((planS[i] == '1'));
hostPrefSum[i + 1] = hostPrefSum[i] + ((planS[i] == '2'));
programPrefSum[i + 1] = programPrefSum[i] + ((planS[i] == '3'));
}
/* for(int i = 0; i <= n; i++)
{
cout << workPrefSum[i] << ' ';
}
cout << '\n';
for(int i = 0; i <= n; i++)
{
cout << hostPrefSum[i] << ' ';
}
cout << '\n';
for(int i = 0; i <= n; i++)
{
cout << programPrefSum[i] << ' ';
}
cout << '\n';
cout << '\n';
for(int i = 0; i < n; i++)
{
cout << i << ' ';
}
cout << '\n';
for(int i = 1; i <= n; i++)
{
cout << i << ' ';
}
cout << '\n';
for(int i = 0; i < n; i++)
{
cout << planS[i] << ' ';
}
cout << '\n'; */
int result = -1;
int skipped = workPrefSum[n];
//cout << skipped << '\n';
if(skipped <= k)
{
//nie musimy ani razu jechac do pracy
int currProgram = skipped + programPrefSum[n] + min(k - skipped, hostPrefSum[n]);
cout << currProgram;
return 0;
}
//od 1 do n
//workSum[mid] - workSum[mid - lenght]
//jednak trzeba troche popracowac ;(
int r = n + 1;
while((r - (t * 2) - 2) >= 0)
{
int mid = r - t; //przed mid
for(int lenght = 1; mid - lenght - (t + 1) >= 0; lenght++)
{
//mid - 1 = ostatnia godzina w pracy
int notSkipped = workPrefSum[mid - 1] - workPrefSum[mid - 1 - lenght];
int newSkipped = (hostPrefSum[r - 1] - hostPrefSum[mid - 1]) + (hostPrefSum[mid - 1 - lenght] - hostPrefSum[mid - 1 - lenght - t]);
int currSkipped = skipped - notSkipped + newSkipped;
if(currSkipped <= k)
{
//dodaj jeszcze te skipniete godziny pracy oraz ile sie da godzin online
//reszte probojemy dobic na zdalnych jak zostaly nam jeszcze spotkania mozliwe do opuszczenia
int programHours = programPrefSum[mid - 1 - lenght - t] + (programPrefSum[n] - programPrefSum[r - 1]);
programHours += workPrefSum[mid - 1 - lenght - t] + (workPrefSum[n] - workPrefSum[r - 1]);
//jak juz je skipnelismy to programujmy :D
programHours += min(k - currSkipped, hostPrefSum[mid - 1 - lenght - t] + (hostPrefSum[n] - hostPrefSum[r - 1]));
result = max(result, programHours);
}
}
r--;
}
cout << result << '\n';
//trzeba dodac do not skipped te co sa w pracy oraz odjac '2' gdy przejezdzam
//sum od r - t do r
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 103 104 105 106 | #include <bits/stdc++.h> using namespace std; int n, k, t; string planS; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> k >> t; cin >> planS; vector<int> workPrefSum(n + 1); workPrefSum[0] = 0; vector<int> hostPrefSum(n + 1); hostPrefSum[0] = 0; vector<int> programPrefSum(n + 1); programPrefSum[0] = 0; for(int i = 0; i < n; i++) { workPrefSum[i + 1] = workPrefSum[i] + ((planS[i] == '1')); hostPrefSum[i + 1] = hostPrefSum[i] + ((planS[i] == '2')); programPrefSum[i + 1] = programPrefSum[i] + ((planS[i] == '3')); } /* for(int i = 0; i <= n; i++) { cout << workPrefSum[i] << ' '; } cout << '\n'; for(int i = 0; i <= n; i++) { cout << hostPrefSum[i] << ' '; } cout << '\n'; for(int i = 0; i <= n; i++) { cout << programPrefSum[i] << ' '; } cout << '\n'; cout << '\n'; for(int i = 0; i < n; i++) { cout << i << ' '; } cout << '\n'; for(int i = 1; i <= n; i++) { cout << i << ' '; } cout << '\n'; for(int i = 0; i < n; i++) { cout << planS[i] << ' '; } cout << '\n'; */ int result = -1; int skipped = workPrefSum[n]; //cout << skipped << '\n'; if(skipped <= k) { //nie musimy ani razu jechac do pracy int currProgram = skipped + programPrefSum[n] + min(k - skipped, hostPrefSum[n]); cout << currProgram; return 0; } //od 1 do n //workSum[mid] - workSum[mid - lenght] //jednak trzeba troche popracowac ;( int r = n + 1; while((r - (t * 2) - 2) >= 0) { int mid = r - t; //przed mid for(int lenght = 1; mid - lenght - (t + 1) >= 0; lenght++) { //mid - 1 = ostatnia godzina w pracy int notSkipped = workPrefSum[mid - 1] - workPrefSum[mid - 1 - lenght]; int newSkipped = (hostPrefSum[r - 1] - hostPrefSum[mid - 1]) + (hostPrefSum[mid - 1 - lenght] - hostPrefSum[mid - 1 - lenght - t]); int currSkipped = skipped - notSkipped + newSkipped; if(currSkipped <= k) { //dodaj jeszcze te skipniete godziny pracy oraz ile sie da godzin online //reszte probojemy dobic na zdalnych jak zostaly nam jeszcze spotkania mozliwe do opuszczenia int programHours = programPrefSum[mid - 1 - lenght - t] + (programPrefSum[n] - programPrefSum[r - 1]); programHours += workPrefSum[mid - 1 - lenght - t] + (workPrefSum[n] - workPrefSum[r - 1]); //jak juz je skipnelismy to programujmy :D programHours += min(k - currSkipped, hostPrefSum[mid - 1 - lenght - t] + (hostPrefSum[n] - hostPrefSum[r - 1])); result = max(result, programHours); } } r--; } cout << result << '\n'; //trzeba dodac do not skipped te co sa w pracy oraz odjac '2' gdy przejezdzam //sum od r - t do r return 0; } |
English