중복값 처리와 배열 초기화 때문에 굉장히 애먹은 문제이다....
접근한 방식은 입력받은 하나의 수열값들을 인덱싱을 통해 표시를 해주고(음수값 + 고정 Value처리)
나머지 하나의 수열을 입력받으면서
교차점일 경우에 해당 인덱스 지점까지의 Prefix_Sum값을 비교해주는 것이다.
(before 교차점까지의 PrefixSum의 차이값 비교)
하지만... 인덱싱 처리해준 값들을 여러테케를 돌리는 문제이다보니
초기화 해주지 않은 것이 화근이었다...ㅠ
좀더 꼼꼼할 필요가 있는 자신을 돌아보게됨..
<Code>
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 | //pda_pro12 #include<algorithm> #include<iostream> #include<vector> #define N_ 10001 #define sz(x) x.size() using namespace std; typedef long long ll; typedef double db; int a[N_], a1[N_], Prefix[N_], Prefix1[N_], n, m, Num[20002], Sum1, Sum2, ans, before, before1; int main() { ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); while (cin >> n && n > 0) { ans = 0; before = 0; before1 = 0; for (int i = 1; i <= n; i++) { cin >> a[i]; Num[a[i] + 10000] = i; Prefix[i] = a[i]; Prefix[i] += Prefix[i - 1]; } cin >> m; for (int i = 1; i <= m; i++) { cin >> a1[i]; Prefix1[i] = a1[i]; Prefix1[i] += Prefix1[i - 1]; if (Num[a1[i] + 10000]) { int lower_Sum = Num[a1[i] + 10000]; Sum1 = Prefix[lower_Sum] - Prefix[before]; Sum2 = Prefix1[i] - Prefix1[before1]; before1 = i; before = lower_Sum; ans += (Sum1 > Sum2) ? Sum1 : Sum2; } } int r = Prefix[n] - Prefix[before]; int q = Prefix1[m] - Prefix1[before1]; ans += (r > q) ? r : q; cout << ans << '\n'; for (int i = 0; i <= 20000; i++) Num[i] = 0; } return 0; } |
'PS) BOJ > Binary Search' 카테고리의 다른 글
[C++] 랜선 자르기 [BOJ 1654] (0) | 2018.08.16 |
---|---|
[C++] K번째 수[백준 1300] (0) | 2018.08.16 |
[C++] 게임 [백준 1072] (0) | 2018.08.16 |
[C++]입국심사[백준 3079] (0) | 2018.08.15 |