#include <bits/stdc++.h> using namespace std; using ll=long long; #define nl '\n' #define sz(x) (int)(x).size() #define each(a, b) for(const auto& a:b) #define rep(a, b) for(int a=0; a<(b); a++) #define coz(x) cerr<<"("<<__LINE__<<") "<<(#x)<<": "<<(x)<<'\n' #define cot(x, l, n) cerr<<"("<<__LINE__<<") "<<(#x)<<": "; \ for(int i=l; i<l+n; i++) { cerr<<x[i]<<' '; } cerr<<'\n' constexpr int N=8e3+6; int c[N]; int pre[N][4]; int cnt[4]; int n,k,t; int sum(int a, int b, int x) { int res=max(0, pre[min(b, n)][x]-pre[max(0, a-1)][x]); return res; } int rozw(int a, int b) { // zadania int z=sum(1, a-t-1, 3)+sum(b+t+1, n, 3); z+=sum(1, a-t-1, 1)+sum(b+t+1, n, 1); // zadania (albo praca) int d=sum(1, a-t-1, 2)+sum(b+t+1, n, 2); // opuszczone spotkania int o=sum(1, a-1, 1)+sum(b+1, n, 1); o+=sum(a-t, a-1, 2)+sum(b+1, b+t, 2); if(o>k) { return -1; } // o<=k d=min(d, (k-o)); int res=z+d; // cerr<<a<<' '<<b<<' '<<z<<' '<<d<<' '<<o<<' '<<k<<' '<<res<<'\n'; return res; } int main() { cin.tie(nullptr)->sync_with_stdio(false); cin>>n>>k>>t; for(int i=1; i<=n; i++) { char x; cin>>x; c[i]=(int)(x-'0'); } for(int i=1; i<=n; i++) { for(int j=1; j<=3; j++) { pre[i][j]=pre[i-1][j]; } pre[i][c[i]]++; } for(int j=1; j<=3; j++) { cnt[j]=pre[n][j]; } int ans=-1; { // domek int z=cnt[3]+cnt[1]; if(cnt[1]<=k) { int d=min(cnt[2], k-cnt[1]); ans=max(ans, z+d); } } for(int i=t+1; i<=n; i++) { for(int j=i; j<=n-t; j++) { ans=max(ans, rozw(i, j)); } } cout<<ans<<nl; }
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 | #include <bits/stdc++.h> using namespace std; using ll=long long; #define nl '\n' #define sz(x) (int)(x).size() #define each(a, b) for(const auto& a:b) #define rep(a, b) for(int a=0; a<(b); a++) #define coz(x) cerr<<"("<<__LINE__<<") "<<(#x)<<": "<<(x)<<'\n' #define cot(x, l, n) cerr<<"("<<__LINE__<<") "<<(#x)<<": "; \ for(int i=l; i<l+n; i++) { cerr<<x[i]<<' '; } cerr<<'\n' constexpr int N=8e3+6; int c[N]; int pre[N][4]; int cnt[4]; int n,k,t; int sum(int a, int b, int x) { int res=max(0, pre[min(b, n)][x]-pre[max(0, a-1)][x]); return res; } int rozw(int a, int b) { // zadania int z=sum(1, a-t-1, 3)+sum(b+t+1, n, 3); z+=sum(1, a-t-1, 1)+sum(b+t+1, n, 1); // zadania (albo praca) int d=sum(1, a-t-1, 2)+sum(b+t+1, n, 2); // opuszczone spotkania int o=sum(1, a-1, 1)+sum(b+1, n, 1); o+=sum(a-t, a-1, 2)+sum(b+1, b+t, 2); if(o>k) { return -1; } // o<=k d=min(d, (k-o)); int res=z+d; // cerr<<a<<' '<<b<<' '<<z<<' '<<d<<' '<<o<<' '<<k<<' '<<res<<'\n'; return res; } int main() { cin.tie(nullptr)->sync_with_stdio(false); cin>>n>>k>>t; for(int i=1; i<=n; i++) { char x; cin>>x; c[i]=(int)(x-'0'); } for(int i=1; i<=n; i++) { for(int j=1; j<=3; j++) { pre[i][j]=pre[i-1][j]; } pre[i][c[i]]++; } for(int j=1; j<=3; j++) { cnt[j]=pre[n][j]; } int ans=-1; { // domek int z=cnt[3]+cnt[1]; if(cnt[1]<=k) { int d=min(cnt[2], k-cnt[1]); ans=max(ans, z+d); } } for(int i=t+1; i<=n; i++) { for(int j=i; j<=n-t; j++) { ans=max(ans, rozw(i, j)); } } cout<<ans<<nl; } |