#include <stdio.h> #include <string> #include <iostream> #include <vector> using namespace std; int main(void){ int n, k, t; int count = 0, contest = 0, max_contest = -1; int remaining_to_skip = 0, count_of_twos = 0; string day; scanf("%d %d %d", &n, &k, &t); cin >> day; // sprawdzamy, czy musi w ogóle wychodzić z domu for(int i=0; i<n; i++) if(day[i]=='1') count++; // jeśli nie musi, to liczymy ile trójek jest if(count <= k){ for(int i=0; i<n; i++){ if(day[i]=='3' || day[i]=='1') contest++; if(day[i]=='2') count_of_twos++; } remaining_to_skip = k - count; for(int i = 0; i<n; i++){ if(day[i]=='2' && remaining_to_skip > 0){ remaining_to_skip--; contest++; } } printf("%d\n", contest); return 0; } //badamy wszystkie możliwości wyjazdów i przyjazdów for(int i = 0; i <= n-t; i++){ for(int j = i+t+1; j <= n-t; j++){ count = 0; contest = 0; // liczymy ile spotkań stacjonarnych opuści poza pracą i zdalnych w podróży for(int l = 0; l < i+t; l++){ if(day[l] == '1') count++; if(day[l] == '2' && l >= i) count++; } for(int l = j; l < n; l++){ if(day[l] == '1') count++; if(day[l] == '2' && l < j+t) count++; } //jeśli opuszcza za dużo, zrezygnuj z tej opcji if(count > k) continue; //liczymy ile ma czasu na zadania poza pracą remaining_to_skip = k - count; for(int l=0; l<i; l++){ if(day[l] == '3') contest++; if((day[l] == '1' || day[l] == '2' ) && remaining_to_skip > 0){ contest++; remaining_to_skip--; } } for(int l=j+t; l<n; l++){ if(day[l] == '3') contest++; if((day[l] == '1' || day[l] == '2' ) && remaining_to_skip > 0){ contest++; remaining_to_skip--; } } //czy może pominąć jeszcze jakieś spotkania if(contest > max_contest) max_contest = contest; //printf("Wyjazd %d-%d, przyjazd %d-%d, godzin %d\n", i+1, i+t, j+1, j+t, contest); } } printf("%d\n", max_contest); 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 | #include <stdio.h> #include <string> #include <iostream> #include <vector> using namespace std; int main(void){ int n, k, t; int count = 0, contest = 0, max_contest = -1; int remaining_to_skip = 0, count_of_twos = 0; string day; scanf("%d %d %d", &n, &k, &t); cin >> day; // sprawdzamy, czy musi w ogóle wychodzić z domu for(int i=0; i<n; i++) if(day[i]=='1') count++; // jeśli nie musi, to liczymy ile trójek jest if(count <= k){ for(int i=0; i<n; i++){ if(day[i]=='3' || day[i]=='1') contest++; if(day[i]=='2') count_of_twos++; } remaining_to_skip = k - count; for(int i = 0; i<n; i++){ if(day[i]=='2' && remaining_to_skip > 0){ remaining_to_skip--; contest++; } } printf("%d\n", contest); return 0; } //badamy wszystkie możliwości wyjazdów i przyjazdów for(int i = 0; i <= n-t; i++){ for(int j = i+t+1; j <= n-t; j++){ count = 0; contest = 0; // liczymy ile spotkań stacjonarnych opuści poza pracą i zdalnych w podróży for(int l = 0; l < i+t; l++){ if(day[l] == '1') count++; if(day[l] == '2' && l >= i) count++; } for(int l = j; l < n; l++){ if(day[l] == '1') count++; if(day[l] == '2' && l < j+t) count++; } //jeśli opuszcza za dużo, zrezygnuj z tej opcji if(count > k) continue; //liczymy ile ma czasu na zadania poza pracą remaining_to_skip = k - count; for(int l=0; l<i; l++){ if(day[l] == '3') contest++; if((day[l] == '1' || day[l] == '2' ) && remaining_to_skip > 0){ contest++; remaining_to_skip--; } } for(int l=j+t; l<n; l++){ if(day[l] == '3') contest++; if((day[l] == '1' || day[l] == '2' ) && remaining_to_skip > 0){ contest++; remaining_to_skip--; } } //czy może pominąć jeszcze jakieś spotkania if(contest > max_contest) max_contest = contest; //printf("Wyjazd %d-%d, przyjazd %d-%d, godzin %d\n", i+1, i+t, j+1, j+t, contest); } } printf("%d\n", max_contest); return 0; } |