알고리즘
백준 4929번 수열 걷기 C++
영춘권의달인
2022. 3. 8. 12:06
두 길을 비교하면서 작은 쪽을 한칸씩 전진시키면서 합을 누적시키고 두 길의 값이 같은 곳에 도달하면 누적된 합 중 큰 값을 최종 합에 추가시키는 방식으로 문제를 해결하였다.
#include <iostream>
#include <string>
#include <vector>
#include <math.h>
#include <algorithm>
#include <utility>
#include <stack>
#include <queue>
#include <math.h>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <iomanip>
using namespace std;
using ll = long long;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
while (true) {
int l1, l2;
cin >> l1;
if (l1 == 0) break;
vector<int> v1(l1);
for (int i = 0; i < l1; i++) {
cin >> v1[i];
}
cin >> l2;
vector<int> v2(l2);
for (int i = 0; i < l2; i++) {
cin >> v2[i];
}
int sum = 0;
int part_sum1 = 0;
int part_sum2 = 0;
int p1 = 0;
int p2 = 0;
while (true) {
if (p1 == l1 && p2 == l2) {
sum += max(part_sum1, part_sum2);
break;
}
else if (p1 == l1) {
part_sum2 += v2[p2];
p2++;
continue;
}
else if (p2 == l2) {
part_sum1 += v1[p1];
p1++;
continue;
}
if (v1[p1] > v2[p2]) {
part_sum2 += v2[p2];
p2++;
}
else if (v1[p1] < v2[p2]) {
part_sum1 += v1[p1];
p1++;
}
else {
sum += max(part_sum1, part_sum2);
sum += v1[p1];
part_sum1 = 0;
part_sum2 = 0;
p1++;
p2++;
}
}
cout << sum << "\n";
}
};