2006 한국정보올림피아드 KOI 고등부 1번 기지국(BOJ: 2300) 풀이
2018. 7. 25. 16:54
x좌표 기준으로 정렬합니다.
dp[4] = (4를 위한 cost) + (1~3의 최적Cost)
dp[4] = min(dp[4] , (3~4 Cost) + (1~2의 최적Cost) )
dp[4] = min(dp[4] , (2~4 Cost) + (1을 위한 Cost) )
dp[4] = min(dp[4] , (1~4 Cost) )
구간의 cost를 구하는 방법
Max(A~B사이의 X축거리 , A~B사이의 모든 건물 중 Y절대값이 가장 큰 값 * 2)
#include <stdio.h> #include <math.h> #include <stdlib.h> long long d[10005]; typedef struct point { long long x, y; }Point; struct point pointList[10000]; int comp(const void* p1, const void* p2) { return ((Point*)p1)->x - ((Point*)p2)->x; } int main() { int N; //freopen("Text.txt", "r", stdin); scanf("%d", &N); for (int i = 0; i < N; i++) { scanf("%lld", &pointList[i].x); scanf("%lld", &pointList[i].y); } qsort(pointList, N, sizeof(Point), comp); d[0] = abs(pointList[0].y) * 2; for (int i = 1; i < N; i++) { d[i] = d[i - 1] + abs(pointList[i].y) * 2; long long maxHeight = 0; for (int j = i-1; j >=0 ; j--) { long long height = abs(pointList[i].y) > abs(pointList[j].y) ? abs(pointList[i].y) * 2 : abs(pointList[j].y) * 2; if (maxHeight < height) { maxHeight = height; } else { height = maxHeight; } long long width = pointList[i].x - pointList[j].x; long long cost; if (j > 0) { cost = d[j - 1] + (height > width ? height : width); } else { cost = (height > width ? height : width); } d[i] = d[i] < cost ? d[i] : cost; } } printf("%lld\n", d[N - 1]); return 0; }
'IT > 정보올림피아드,문제해결' 카테고리의 다른 글
2012 한국정보올림피아드 시.도지역본선 고등부 2번 회전초밥(BOJ: 2531) 풀이 (0) | 2018.07.25 |
---|---|
퀵소트구현 (0) | 2018.07.13 |
2013 한국정보올림피아드 시.도지역본선 고등부 4번 앱(BOJ: 7579) 풀이 (0) | 2018.07.06 |