case를 잘 구하면 되는 문제다.
"친구가 만들어 준 길을 다 걷지 않았다면 마저 걸어야 한다." 라는 말은 다른 모든 친구들의 길을 포함하는게 아니고
i번째 친구의 길을 이용하기로 마음 먹었으면 마지막 종착지가 새 집이더라도
새 집에서 기존 루트로 연결되는 길까지 걸리는 시간도 포함해야 한다는 것이다.
그렇기 때문에 새 집으로 연결하는 루트의 전체 길이만 줄 뿐 들어가는길, 나오는길 길이를 따로주지 않는다.
경로의 길이는 누적합을 활용한다.
경우 1.
0 - A - 새집 - B - N - A+1
A - A+1 < B - N
경우 2.
0 - A - 새집 - B - N - B - 새집 - A - B-1
B-1 - B < w + B - N (w = A - 새집 - B)
경우 3.
0 - B - 새집 - A - N
== 0 - A - 새집 - B - A - N
A - B < else
경우 4.
0 - A - 새집 - B - 새집 - A - N
== 0 - B - 새집 - A - 새집 - B - N
w < else
경우 5.
0 - A - 새집 - B - N
A - B가 바로 연결
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #include <stdio.h> #include <algorithm> using namespace std; int n, m; long long d[10001], res = 2e9; int main() { scanf("%d%d", &n, &m); for (int i = 1; i <= n; i++) scanf("%d", &d[i]), d[i] += d[i - 1]; for (int i = 0, u, v, w; i < m; i++) { scanf("%d %d %d", &u, &v, &w); if (u > v) swap(u, v); if (v - u == 1) res = min(res, d[u] + w + d[n] - d[v]); res = min(res, d[u] + w + (d[n] - d[v]) + d[n] - d[u + 1]); res = min(res, w * 2 + (d[n] - d[v]) * 2 + d[v - 1]); res = min(res, d[v] + w + d[n] - d[u]); res = min(res, w * 2 + d[n]); } printf("%lld", res); return 0; } | cs |
'BOJ' 카테고리의 다른 글
14945 불장난 (0) | 2017.12.12 |
---|---|
2504 괄호의 값 (0) | 2017.12.12 |
14943 벼룩시장 (0) | 2017.12.12 |
2931 가스관 (0) | 2017.12.01 |
1198 삼각형으로 자르기 (0) | 2017.10.30 |