This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
int n, l;
int x[210], t[210];
int dp[210][210][210][2];
const int MAX = 1e9 + 1;
int getDist(int i, int j){
int ret = x[i] - x[j]; ret %= l;
if(ret < 0) ret += l;
return min(ret, l - ret);
}
int main(){
scanf("%d%d", &n, &l);
for(int i = 1; i <= n; i++) scanf("%d", &x[i]);
for(int i = 1; i <= n; i++) scanf("%d", &t[i]);
for(int i = 0; i <= n + 1; i++)
for(int j = 0; j <= n + 1; j++)
for(int k = 0; k <= n + 1; k++)
dp[i][j][k][0] = dp[i][j][k][1] = MAX;
dp[0][n + 1][0][0] = dp[0][n + 1][0][1] = 0;
for(int len = n + 1; len >= 1; len--){
for(int i = 0; i + len <= n + 1; i++){
int j = i + len;
for(int k = 0; k <= n; k++){
// if(k == 5 && dp[i][j][k][0] != MAX) printf("dp[%d][%d][%d][0] = %d\n", i, j, k, dp[i][j][k][0]);
// if(k == 5 && dp[i][j][k][1] != MAX) printf("dp[%d][%d][%d][1] = %d\n", i, j, k, dp[i][j][k][1]);
int dist;
//Position on right [clockwise]
if(dp[i][j][k][0] != MAX){
//From i to i + 1
dist = getDist(i, i + 1);
dist += dp[i][j][k][0];
if(dist <= t[i + 1])
dp[i + 1][j][k + 1][0] = min(dp[i + 1][j][k + 1][0], dist);
else
dp[i + 1][j][k][0] = min(dp[i + 1][j][k][0], dist);
//From i to j - 1
dist = getDist(i, j - 1);
dist += dp[i][j][k][0];
if(dist <= t[j - 1])
dp[i][j - 1][k + 1][1] = min(dp[i][j - 1][k + 1][1], dist);
else
dp[i][j - 1][k][1] = min(dp[i][j - 1][k][1], dist);
}
//Position on left [counter clockwise]
if(dp[i][j][k][1] != MAX){
//From j to j - 1
dist = getDist(j, j - 1);
dist += dp[i][j][k][1];
if(dist <= t[j - 1])
dp[i][j - 1][k + 1][1] = min(dp[i][j - 1][k + 1][1], dist);
else
dp[i][j - 1][k][1] = min(dp[i][j - 1][k][1], dist);
//From j to i + 1
dist = getDist(j, i + 1);
dist += dp[i][j][k][1];
if(dist <= t[i + 1])
dp[i + 1][j][k + 1][0] = min(dp[i + 1][j][k + 1][0], dist);
else
dp[i + 1][j][k][0] = min(dp[i + 1][j][k][0], dist);
}
}
}
}
int ans = 0;
for(int i = 0; i <= n; i++)
for(int cnt = 0; cnt <= n; cnt++)
if(dp[i][i + 1][cnt][0] != MAX || dp[i][i + 1][cnt][1] != MAX)
ans = max(ans, cnt);
printf("%d\n", ans);
return 0;
}
Compilation message (stderr)
ho_t3.cpp: In function 'int main()':
ho_t3.cpp:19:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d%d", &n, &l);
~~~~~^~~~~~~~~~~~~~~~
ho_t3.cpp:21:38: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
for(int i = 1; i <= n; i++) scanf("%d", &x[i]);
~~~~~^~~~~~~~~~~~~
ho_t3.cpp:22:38: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
for(int i = 1; i <= n; i++) scanf("%d", &t[i]);
~~~~~^~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |