#include <cstdio> struct seg { int m_off_l; int m_off_r; int m_rem_l; int m_rem_r; }; int main(void) { int i, n, k, t, r, l, m_req, s = -1; char day[8001] = { 0 }; seg segs[8001] = { 0 }; scanf("%d%d%d%s", &n, &k, &t, day); for (i = 1; i <= n; i++) { segs[i].m_off_l = segs[i-1].m_off_l; segs[i].m_rem_l = segs[i-1].m_rem_l; if (day[i-1] == '1') segs[i].m_off_l++; if (day[i-1] == '2') segs[i].m_rem_l++; } for (i = 0; i < n; i++) { segs[i].m_off_r = segs[n].m_off_l - segs[i].m_off_l; segs[i].m_rem_r = segs[n].m_rem_l - segs[i].m_rem_l; } m_req = segs[0].m_off_r + segs[0].m_rem_r - k; if (m_req < 0) m_req = 0; if (segs[0].m_off_r <= k) { printf("%d\n", n - m_req); return 0; } for (r = 2*t; r <= n; r++) { for (l = 0; l <= r - 2*t; l++) { int m_rem = segs[r].m_rem_r + segs[l].m_rem_l; int m_off = segs[r-t].m_off_l + segs[r-t].m_rem_l - segs[l+t].m_off_l - segs[l+t].m_rem_l; int m_av = m_rem + m_off; if (m_av < m_req) continue; int m_remreq = m_req - m_off; if (m_remreq < 0) m_remreq = 0; int n_av = n - r + l - m_remreq; if (n_av > s) s = n_av; } } printf("%d\n", s); 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 | #include <cstdio> struct seg { int m_off_l; int m_off_r; int m_rem_l; int m_rem_r; }; int main(void) { int i, n, k, t, r, l, m_req, s = -1; char day[8001] = { 0 }; seg segs[8001] = { 0 }; scanf("%d%d%d%s", &n, &k, &t, day); for (i = 1; i <= n; i++) { segs[i].m_off_l = segs[i-1].m_off_l; segs[i].m_rem_l = segs[i-1].m_rem_l; if (day[i-1] == '1') segs[i].m_off_l++; if (day[i-1] == '2') segs[i].m_rem_l++; } for (i = 0; i < n; i++) { segs[i].m_off_r = segs[n].m_off_l - segs[i].m_off_l; segs[i].m_rem_r = segs[n].m_rem_l - segs[i].m_rem_l; } m_req = segs[0].m_off_r + segs[0].m_rem_r - k; if (m_req < 0) m_req = 0; if (segs[0].m_off_r <= k) { printf("%d\n", n - m_req); return 0; } for (r = 2*t; r <= n; r++) { for (l = 0; l <= r - 2*t; l++) { int m_rem = segs[r].m_rem_r + segs[l].m_rem_l; int m_off = segs[r-t].m_off_l + segs[r-t].m_rem_l - segs[l+t].m_off_l - segs[l+t].m_rem_l; int m_av = m_rem + m_off; if (m_av < m_req) continue; int m_remreq = m_req - m_off; if (m_remreq < 0) m_remreq = 0; int n_av = n - r + l - m_remreq; if (n_av > s) s = n_av; } } printf("%d\n", s); return 0; } |