제출 #510043

#제출 시각아이디문제언어결과실행 시간메모리
510043CSQ31Collecting Stamps 3 (JOI20_ho_t3)C++17
100 / 100
173 ms130804 KiB
#include <bits/stdc++.h> using namespace std; long long int dp[205][205][205][2]; int n,L,x[400],t[400]; const long long int INF = 1e18; int dist(int l,int r){ if(r >= l)return x[r] - x[l]; return L-x[l] + x[r]; } int main() { cin>>n>>L; for(int i=1;i<=n;i++)cin>>x[i]; for(int i=1;i<=n;i++)cin>>t[i]; for(int i=0;i<=n;i++){ for(int j=0;j<=n;j++) for(int k=0;k<=n+1;k++)dp[i][j][k][0] = dp[i][j][k][1] = INF; } t[0] = -1; dp[0][0][0][0] = 0; n++; int ans = 0; for(int i=0;i<n;i++){ for(int l=0;l<n;l++){ for(int k=0;k<=n;k++){ int r = (l+i)%n; for(int c=0;c<2;c++){ if(dp[l][r][k][c] == INF)continue; //cout<<l<<" "<<r<<" "<<k<<" "<<c<<" "<<dp[l][r][k][c]<<'\n'; ans = max(ans,k); int s = c?r:l; int ln = (l-1+n)%n; int d = dist(ln,s); long long int v = dp[l][r][k][c] + d; dp[ln][r][k][0] = min(dp[ln][r][k][0],v); if(t[ln] >= v)dp[ln][r][k+1][0] = min(dp[ln][r][k+1][0],v); int rn = (r+1)%n; d = dist(s,rn); v = dp[l][r][k][c] + d; dp[l][rn][k][1] = min(dp[l][rn][k][1],v); if(t[rn] >= v)dp[l][rn][k+1][1] = min(dp[l][rn][k+1][1],v); } } } } cout<<ans<<'\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...