티스토리 뷰
#include <stdio.h>
int main(void)
{
int n;
scanf("%d", &n);
long long arr[n], left[n], right[n], tmp = n-1; //변수들과 배열들
for(int i=0; i<n; i++) scanf("%lld", &arr[i]); //n개의 횡단보도 길이
left[0] = right[tmp] = 0; //왼쪽 시작지점과 오른쪽 마지막 지점은 길이가 0 입니다.
for(int i=1; i<n; i++) { //왼쪽 이동 길이
scanf("%lld", &left[i]);
left[i] += left[i-1]; //이전의 값을 더해줍니다.
}
for(int i=0; i<tmp; i++) scanf("%lld", &right[i]); //오른쪽 이동 길이
for(int i=tmp-1; i>=0; i--) right[i] += right[i+1]; //반대로 더해줍니다.
long long min = 1e16, key=0; //min은 최솟값을, key는 최소 길이의 길의 번호를 저장하는 변수
for(int i=0; i<n; i++) {
long long tmp = left[i] + right[i] + arr[i]; //왼쪽 이동길이 + 오른쪽 이동길이 + 횡단보도 길이
if(min > tmp) { //작다면?
key = i+1;
min = tmp;
}
}
printf("%lld %lld", key, min); //최소길이일 떄의 번호와 그때의 최소값을 출력합니다.
}
풀이 : 누적합
이 문제는
횡단보도를 건너기 전까지의 왼쪽 이동길이 (초기값 0)
횡단보도의 길이
횡단보도를 건넌 이후 오른쪽 이동길이 (마지막 값이 0)
을 더한 다음 이 중 가장 작은 값과, 이때의 번호를 출력하면 되는 문제입니다.
왼쪽 이동길이는, 누적합을 이용해, 이전의 길이를 계속 더해주며
오른쪽 이동길이는, 누적합을 이용하는 것은 같으나, 왼쪽과는 방향이 반대이므로 맨마지막 것부터 이전 값에 누적 시켜줍니다.
그런 다음 왼쪽의 길이 + 횡단보도의 길이 + 오른쪽의 길이 중 가장 값이 적은 것을 찾으면 됩니다.
https://www.acmicpc.net/problem/12841
12841번: 정보대 등산
숭실 대학교 정보 과학관은 숭실 대학교 건물 중 제일 높은 곳에 있다. 민주는 평소에 버스를 타고 이 언덕을 오르지만, 이 문제에 등장하기 위하여 오늘 하루만 걸어서 올라간다. 정보 과학관을
www.acmicpc.net
'c언어 > BAEKJOON' 카테고리의 다른 글
c언어 26007번 Codepowers (백준) (0) | 2023.07.30 |
---|---|
c언어 27968번 사사의 사차원 사탕 봉지 (백준) (0) | 2023.07.30 |
c언어 14465번 소가 길을 건넌 이유 5 (백준) (0) | 2023.07.28 |
c언어 24999번 blobyum (백준) (0) | 2023.07.23 |
c언어 11059번 크리 문자열 (백준) (0) | 2023.07.23 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Lazy Propagation
- 기하학
- Segment Tree
- C++
- union
- 누적합
- DP
- 그리디
- XOR
- 오프라인 쿼리
- BFS
- DFS
- find
- java
- 세그먼트 트리
- PASCAL
- 1835번
- 정렬
- Krustal
- C언어
- 덱
- 누적 합
- 플로이드
- 그래프
- 백준
- 1835
- 최소 스패닝 트리
- 최대공약수
- 스택
- 브루트포스
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
글 보관함