알고리즘
백준 2118번 두 개의 탑 C++
영춘권의달인
2022. 3. 9. 11:22
1부터 n까지의 누적 합을 저장하는 배열을 만들고, left는 1, right는 2로 시작하여 left~right의 누적 합이 반대편의 누적 합보다 크다면 left를 늘리고, 작다면 right를 늘리는 방식으로 문제를 해결하였다.
#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);
int n, dist;
cin >> n;
int sum = 0;
vector<int> sumv(n + 1, 0);
for (int i = 2; i <= n; i++) {
cin >> dist;
sumv[i] += sumv[i - 1] + dist;
sum += dist;
}
cin >> dist;
sum += dist;
int left = 1;
int right = 2;
int ans = 0;
while (true) {
int partsum1 = sumv[right] - sumv[left];
int partsum2 = sum - partsum1;
int val = min(partsum1, partsum2);
if (left == n && right == n) break;
if (right == n) {
ans = max(ans, val);
left++;
continue;
}
ans = max(ans, val);
if (partsum1 > partsum2) left++;
else right++;
}
cout << ans;
};