문제 풀이
[SWEA] 1859번 백만 장자 프로젝트
컴영
2020. 4. 17. 21:05
1859 백만 장자 프로젝트
문제는 불법 복사가 금지되어있어서 풀이만 쓰겠다.
풀이)
일단, N일동안의 매매가를 배열에 저장해 둔다.
그리고
1. 처음 인덱스부터 마지막인덱스( 0 ~ n - 1 ) 값 중 가장 큰 값의 마지막 인덱스(i)를 찾는다.
2. (0번째 인덱스 ~ i - 1)까지 이득을 구한다.
이득은 array[i] - 각 인덱스의 값 들의 합.
3. i + 1 부터 마지막 인덱스 n - 1까지 중 가장 큰 값의 마지막 인덱스(j)를 찾는다.
4. (i+1 인덱스 ~ j)까지 이득을 구한다.
3, 4번을 현재 인덱스가 n - 1까지 계속 반복하면 된다.
예를 들어)
N=6, 매매가 1,1,3,1,1,2일 때 계산 과정을 본다면
주의
매매가의 최고값이 10,000이고, N은 1,000,000개까지 있을 수 있으니깐
이득 변수의 자료형을 int가 아닌 long long 으로 두어야한다.
코드)
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | #include <stdio.h> #include <iostream> #include <algorithm> using namespace std; int arr[1000001]; int n; int findMax(int idx) { int tmp = 0; int tmpx = 0; for (int i = idx; i < n; i++) { if (tmp < arr[i]) { tmp = arr[i]; tmpx = i; } else if (tmp == arr[i]) { tmpx = i; } } return tmpx;//최고값의 마지막 인덱스 return } int main(int argc, char** argv) { int test_case = 0; int T = 0; //freopen("input.txt", "r", stdin); scanf("%d", &T); for (test_case = 1; test_case <= T; ++test_case) { scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d", &arr[i]); } long long profit = 0; for (int i = 0; i < n;) { int goal = findMax(i); while (i != goal) { profit += arr[goal] - arr[i]; i++; } i++; } printf("#%d %lld\n", test_case, profit); fill(arr, arr + n, 0); } return 0; } | cs |