#include <iostream> #include <algorithm> #include <vector> using namespace std; struct timepoint { int PA, meetingRemote, meetingLocal; explicit timepoint(int pa, int mr, int ml) { PA = pa; meetingRemote = mr; meetingLocal = ml; } timepoint(const timepoint &roller) { PA = roller.PA; meetingRemote = roller.meetingRemote; meetingLocal = roller.meetingLocal; } timepoint() { PA = 0; meetingRemote = 0; meetingLocal = 0; } }; timepoint findDifference(timepoint beg, timepoint en) { return timepoint(en.PA - beg.PA, en.meetingRemote - beg.meetingRemote, en.meetingLocal - beg.meetingLocal); } int summarizeMeeting(timepoint time) { return time.meetingLocal + time.meetingRemote; } int checkCase(vector<timepoint> &timeCourse, int tripStart, int tripEnd, int meetingThreshold, int t) { int travelTimeLost = summarizeMeeting(findDifference(timeCourse[tripStart-1], timeCourse[tripStart + t])) + summarizeMeeting(findDifference(timeCourse[tripEnd - t - 1 ], timeCourse[tripEnd])); // rest of the time can be spent on PA, with exclusion of the meeting time int meetingsAttended = summarizeMeeting(findDifference(timeCourse[tripStart + t - 1], timeCourse[tripEnd - t])); int homeMeetings = timeCourse[tripStart- 1].meetingRemote + findDifference(timeCourse[tripEnd], timeCourse.back()).meetingRemote; //printf("Meetings attended: %d, homeMeetings %d", meetingsAttended, homeMeetings); int meetingBalance = homeMeetings - (meetingThreshold - meetingsAttended); if (meetingBalance < 0) { return -1; } return timeCourse[tripStart-1].PA + timeCourse[tripStart-1].meetingLocal + findDifference(timeCourse[tripEnd], timeCourse.back()).PA + findDifference(timeCourse[tripEnd], timeCourse.back()).meetingLocal + meetingBalance; } vector<timepoint> timepoints; int main () { ios_base::sync_with_stdio(0); int n, k, t; cin >> n >> k >> t; timepoint roll(0, 0, 0); //push dummy 0-timepoint timepoints.push_back(roll); for(int i = 0; i<n; i++) { char action; cin >> action; switch (action) { case '1': roll.meetingLocal++; break; case '2': roll.meetingRemote++; break; case '3': roll.PA++; break; } timepoints.push_back(roll); } //set initial results int meetingThreshold = max(roll.meetingLocal + roll.meetingRemote - k, 0); int res; // never going to the office //missing all local meetings // if there are not enough remote meetings then res is -1 if (meetingThreshold > roll.meetingRemote) { res = -1; } else { // spend all time on potyczki, excluding the mandatory meetings res = n - meetingThreshold; } //iterate over all possible trip times for(int i=1; i <= n; i++) { for(int j = i + 2*t; j <= n; j++) { int caseTes = checkCase(timepoints, i, j, meetingThreshold, t); //printf("start: %d, stop: %d, caseResult: %d\n", i, j, caseTes); res = max(res, caseTes); } } printf("%d\n", res); 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 107 108 109 110 111 112 113 | #include <iostream> #include <algorithm> #include <vector> using namespace std; struct timepoint { int PA, meetingRemote, meetingLocal; explicit timepoint(int pa, int mr, int ml) { PA = pa; meetingRemote = mr; meetingLocal = ml; } timepoint(const timepoint &roller) { PA = roller.PA; meetingRemote = roller.meetingRemote; meetingLocal = roller.meetingLocal; } timepoint() { PA = 0; meetingRemote = 0; meetingLocal = 0; } }; timepoint findDifference(timepoint beg, timepoint en) { return timepoint(en.PA - beg.PA, en.meetingRemote - beg.meetingRemote, en.meetingLocal - beg.meetingLocal); } int summarizeMeeting(timepoint time) { return time.meetingLocal + time.meetingRemote; } int checkCase(vector<timepoint> &timeCourse, int tripStart, int tripEnd, int meetingThreshold, int t) { int travelTimeLost = summarizeMeeting(findDifference(timeCourse[tripStart-1], timeCourse[tripStart + t])) + summarizeMeeting(findDifference(timeCourse[tripEnd - t - 1 ], timeCourse[tripEnd])); // rest of the time can be spent on PA, with exclusion of the meeting time int meetingsAttended = summarizeMeeting(findDifference(timeCourse[tripStart + t - 1], timeCourse[tripEnd - t])); int homeMeetings = timeCourse[tripStart- 1].meetingRemote + findDifference(timeCourse[tripEnd], timeCourse.back()).meetingRemote; //printf("Meetings attended: %d, homeMeetings %d", meetingsAttended, homeMeetings); int meetingBalance = homeMeetings - (meetingThreshold - meetingsAttended); if (meetingBalance < 0) { return -1; } return timeCourse[tripStart-1].PA + timeCourse[tripStart-1].meetingLocal + findDifference(timeCourse[tripEnd], timeCourse.back()).PA + findDifference(timeCourse[tripEnd], timeCourse.back()).meetingLocal + meetingBalance; } vector<timepoint> timepoints; int main () { ios_base::sync_with_stdio(0); int n, k, t; cin >> n >> k >> t; timepoint roll(0, 0, 0); //push dummy 0-timepoint timepoints.push_back(roll); for(int i = 0; i<n; i++) { char action; cin >> action; switch (action) { case '1': roll.meetingLocal++; break; case '2': roll.meetingRemote++; break; case '3': roll.PA++; break; } timepoints.push_back(roll); } //set initial results int meetingThreshold = max(roll.meetingLocal + roll.meetingRemote - k, 0); int res; // never going to the office //missing all local meetings // if there are not enough remote meetings then res is -1 if (meetingThreshold > roll.meetingRemote) { res = -1; } else { // spend all time on potyczki, excluding the mandatory meetings res = n - meetingThreshold; } //iterate over all possible trip times for(int i=1; i <= n; i++) { for(int j = i + 2*t; j <= n; j++) { int caseTes = checkCase(timepoints, i, j, meetingThreshold, t); //printf("start: %d, stop: %d, caseResult: %d\n", i, j, caseTes); res = max(res, caseTes); } } printf("%d\n", res); return 0; } |