//Jakub Rozek //Wystawa //czas: 2^n //pamiec: n #include "bits/stdc++.h" using namespace std; const int N=100005; const long long INF=10000000000000016; long long odp=INF; int n,k; bool odwroc; bitset <N> obecny; bitset <N> wynik; long long t[2][N]; long long dp[N][2]; void wczytaj(int p) { for(int i=1; i<=n; ++i) cin>>t[p][i]; } void licz(int i, int kk, long long suf, long long wyn) { if(suf>=odp) return; if(suf<0) suf=0; if(suf>wyn) wyn=suf; if(kk==k) { if(dp[i][1]>wyn) wyn=dp[i][1]; suf+=dp[i][0]; if(suf>wyn) wyn=suf; if(wyn<odp) { odp=wyn; wynik=obecny; } return; } if(i>n || n-i+1<k-kk) return; obecny[i]=1; licz(i+1,kk+1,suf+t[0][i],wyn); obecny[i]=0; licz(i+1,kk,suf+t[1][i],wyn); return; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin>>n>>k; if(k*2<=n) { odwroc=0; wczytaj(0); wczytaj(1); } else { k=n-k; odwroc=1; wczytaj(1); wczytaj(0); } for(int i=n; i>=1; --i) { dp[i][0]=max((long long)0,dp[i+1][0]+t[1][i]); dp[i][1]=max(dp[i+1][1],dp[i][0]); } licz(1,0,0,0); cout<<odp<<"\n"; if(odwroc) for(int i=1; i<=n; ++i) wynik[i]=!wynik[i]; for(int i=1; i<=n; ++i) { if(wynik[i]) cout<<"A"; else cout<<"B"; } 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 | //Jakub Rozek //Wystawa //czas: 2^n //pamiec: n #include "bits/stdc++.h" using namespace std; const int N=100005; const long long INF=10000000000000016; long long odp=INF; int n,k; bool odwroc; bitset <N> obecny; bitset <N> wynik; long long t[2][N]; long long dp[N][2]; void wczytaj(int p) { for(int i=1; i<=n; ++i) cin>>t[p][i]; } void licz(int i, int kk, long long suf, long long wyn) { if(suf>=odp) return; if(suf<0) suf=0; if(suf>wyn) wyn=suf; if(kk==k) { if(dp[i][1]>wyn) wyn=dp[i][1]; suf+=dp[i][0]; if(suf>wyn) wyn=suf; if(wyn<odp) { odp=wyn; wynik=obecny; } return; } if(i>n || n-i+1<k-kk) return; obecny[i]=1; licz(i+1,kk+1,suf+t[0][i],wyn); obecny[i]=0; licz(i+1,kk,suf+t[1][i],wyn); return; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin>>n>>k; if(k*2<=n) { odwroc=0; wczytaj(0); wczytaj(1); } else { k=n-k; odwroc=1; wczytaj(1); wczytaj(0); } for(int i=n; i>=1; --i) { dp[i][0]=max((long long)0,dp[i+1][0]+t[1][i]); dp[i][1]=max(dp[i+1][1],dp[i][0]); } licz(1,0,0,0); cout<<odp<<"\n"; if(odwroc) for(int i=1; i<=n; ++i) wynik[i]=!wynik[i]; for(int i=1; i<=n; ++i) { if(wynik[i]) cout<<"A"; else cout<<"B"; } return 0; } |