이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#define pb emplace_back
#define ll long long
#define fi first
#define se second
#define mp make_pair
//#define int int64_t
using namespace std;
const int N = 405;
const int inf = (int)2e9;
typedef pair<int, int> pii;
ll f[N][N][203][2];
int n, x[N], t[N], L;
int dis(int s, int t) {return min(abs(x[s] - x[t]), L - abs(x[s] - x[t]));}
ll DP(int l, int r, int k, bool inS) {
if(l <= 0 || r > n + n + 1 || k < 0) return inf;
if(f[l][r][k][inS] != -1) return f[l][r][k][inS];
ll& res = f[l][r][k][inS]; res = inf;
if(r < l || k > (r - l + 1) || r - l > n) return res;
ll g;
g = DP(l + 1, r, k, 1);
if(g < inf) {
if(!inS) res = min(res, g + dis(l + 1, l) + dis(r, l));
else res = min(res, g + dis(l + 1, l));
}
g = DP(l + 1, r, k, 0);
if(g < inf) {
if(!inS) res = min(res, g + 2 * dis(l, r));
else res = min(res, g + dis(l, r));
}
g = DP(l + 1, r, k - 1, 1);
if(g < inf && g + dis(l + 1, l) <= t[l]) {
if(!inS) res = min(res, g + dis(l + 1, l) + dis(r, l));
else res = min(res, g + dis(l + 1, l));
}
g = DP(l + 1, r, k - 1, 0);
if(g < inf && g + dis(l, r) <= t[l]) {
if(!inS) res = min(res, g + 2 * dis(l, r));
else res = min(res, g + dis(l, r));
}
///
g = DP(l, r - 1, k, 1);
if(g < inf) {
if(!inS) res = min(res, g + dis(l, r));
else res = min(res, g + 2 * dis(l, r));
}
g = DP(l, r - 1, k, 0);
if(g < inf) {
if(!inS) res = min(res, g + dis(r - 1, r));
else res = min(res, g + dis(r - 1, r) + dis(l, r));
}
g = DP(l, r - 1, k - 1, 1);
if(g < inf && g + dis(l, r) <= t[r]) {
if(!inS) res = min(res, g + dis(l, r));
else res = min(res, g + 2 * dis(l, r));
}
g = DP(l, r - 1, k - 1, 0);
if(g < inf && g + dis(r - 1, r) <= t[r]) {
if(!inS) res = min(res, g + dis(r - 1, r));
else res = min(res, g + dis(r - 1, r) + dis(l, r));
}
return res;
}
int32_t main() {
ios_base::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
#define Task "test"
if(fopen(Task".inp", "r")) {
freopen(Task".inp", "r", stdin);
freopen(Task".out", "w", stdout);
}
cin >> n >> L; x[0] = 1; x[n + 1] = L;
for(int i = 1; i <= n; ++i) cin >> x[i], x[i + n + 1] = x[i] + L;
for(int i = 1; i <= n; ++i) cin >> t[i], t[i + n + 1] = t[i];
memset(&f, -1, sizeof f);
f[n + 1][n + 1][0][0] = f[n + 1][n + 1][0][1] = 0;
f[n + 1][n + 1][1][0] = f[n + 1][n + 1][1][1] = inf;
int ans = 0;
for(int i = 1; i <= n; ++i) {
for(int j = n + 1; j <= n + n + 1; ++j) {
for(int k = 1; k <= n; ++k) {
for(int d = 0; d < 2; ++d) {
if(DP(i, j, k, d) < inf) ans = max(ans, k);
}
}
}
}
cout << ans;
}
컴파일 시 표준 에러 (stderr) 메시지
ho_t3.cpp: In function 'int32_t main()':
ho_t3.cpp:76:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
freopen(Task".inp", "r", stdin);
~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
ho_t3.cpp:77:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
freopen(Task".out", "w", stdout);
~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
# | 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... |