Submission #1172187

#TimeUsernameProblemLanguageResultExecution timeMemory
1172187AlgorithmWarriorCollecting Stamps 3 (JOI20_ho_t3)C++20
100 / 100
73 ms130700 KiB
#include <bits/stdc++.h> #define MAX 205 using namespace std; long long dp[MAX][MAX][MAX][2]; /// dp[i][j][k][0/1] = timpul minim sa parcurgem primele i clockwise /// si primele j counterclockwise colectand cel putin k statui /// si avand 1 (daca ne oprim la al i-lea clockwise) /// sau 0 (daca ne oprim la al j-lea counterclockwise) int dist[MAX]; int limit[MAX]; int N,L; int ans; void read() { cin>>N>>L; int i; for(i=1;i<=N;++i) cin>>dist[i]; for(i=1;i<=N;++i) cin>>limit[i]; dist[N+1]=L; dist[N+2]=L; } void minself(long long& x,long long y) { x=min(x,y); } void calc_dp() { int i,j,k; for(i=0;i<=N;++i) for(j=0;j<=N;++j) for(k=0;k<=N;++k) dp[i][j][k][0]=dp[i][j][k][1]=2e18; dp[0][0][0][0]=0; dp[0][0][0][1]=0; for(i=0;i<=N;++i) for(j=0;j<=N-i;++j) { if(!i && !j) continue; int totaldist=dist[i]+L-dist[N-j+1]; int dist1=dist[i]-dist[i-1]; int dist0=dist[N-j+2]-dist[N-j+1]; dp[i][j][0][1]=2LL*(L-dist[N-j+1])+dist[i]; dp[i][j][0][0]=2LL*dist[i]+L-dist[N-j+1]; for(k=1;k<=i+j;++k) { if(i) { minself(dp[i][j][k][1],dp[i-1][j][k][1]+dist1); if(dp[i-1][j][k-1][1]+dist1<=limit[i]) minself(dp[i][j][k][1],dp[i-1][j][k-1][1]+dist1); } if(j) { minself(dp[i][j][k][0],dp[i][j-1][k][0]+dist0); if(dp[i][j-1][k-1][0]+dist0<=limit[N-j+1]) minself(dp[i][j][k][0],dp[i][j-1][k-1][0]+dist0); } minself(dp[i][j][k][0],dp[i][j][k][1]+totaldist); minself(dp[i][j][k][1],dp[i][j][k][0]+totaldist); } } } void debug() { int i,j,k,l; for(i=0;i<=N;++i) for(j=0;j<=N;++j) for(k=0;k<=N;++k) for(l=0;l<2;++l) if(dp[i][j][k][l]<2e9) cout<<dp[i][j][k][l]<<' '<<i<<' '<<j<<' '<<k<<' '<<l<<'\n'; } void get_answer() { int i,j,k,l; for(i=0;i<=N;++i) for(j=0;j<=N-i;++j) for(k=0;k<=i+j;++k) for(l=0;l<2;++l) if(dp[i][j][k][l]<2e18) ans=max(ans,k); } void write() { cout<<ans; } int main() { read(); calc_dp(); get_answer(); write(); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...