※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 14922번 문제인 부분평균이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/14922
14922번: 부분평균
A를 길이 N인 양의 정수로 구성된 배열이라고 하자.(N>2) 정수 P, Q(0<=P<Q<N) 에 대해서 A의 부분평균 A(P, Q)를 다음과 같이 정의하자. \[\frac{\sum_{i=P}^{Q}{A[i]}}{Q-P+1}\] 예를 들어 주어진 배열 A의 길이가 3
www.acmicpc.net
임의의 네 개의 수 A B C D가 있을 때 이 네 수의 평균은 (A와 B의 평균)과 (C와 D의 평균)의 평균과 같고, 결국 그 값은 min((A와 B의 평균), (C와 D의 평균))보다 작아질 수 없다.
같은 원리로 넷 이상의 수로 이루어진 연속한 구간이 있을 때, 이들을 각 구간의 크기가 2 이상이 되도록 왼쪽과 오른쪽의 두 구간으로 양분하면 min(왼쪽구간의 평균, 오른쪽구간의 평균)보다 전체의 평균이 더 작아질 수 없다는 것을 관찰할 수 있다.
따라서, 부분평균의 최솟값을 갖는 구간은 "길이 2의 구간"과 "길이 3의 구간"만을 전부 조사하는 것으로 적어도 하나 이상을 찾아낼 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <vector>
using namespace std;
typedef long long ll;
ll arr[1000000];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int N; cin >> N;
for (int i = 0; i < N; i++) cin >> arr[i];
pair<ll, int> mn2 = make_pair(arr[0] + arr[1], 0), mn3 = make_pair(1000000000000000007LL, 1000000007);
for (int i = 2; i < N; i++) {
mn2 = min(mn2, make_pair(arr[i - 1] + arr[i], i - 1));
mn3 = min(mn3, make_pair(arr[i - 2] + arr[i - 1] + arr[i], i - 2));
}
if (mn2.first * 3 < mn3.first * 2) cout << mn2.second;
else cout << mn3.second;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 14920 // C++] 3n+1 수열 (0) | 2022.04.24 |
---|---|
[BOJ 14921 // C++] 용액 합성하기 (0) | 2022.04.24 |
[BOJ 14939 // C++] 불 끄기 (0) | 2022.04.23 |
[BOJ 24552 // C++] 올바른 괄호 (0) | 2022.04.22 |
[BOJ 24542 // C++] 튜터-튜티 관계의 수 (0) | 2022.04.21 |