※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 20116번 문제인 상자의 균형이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/20116 

 

문제가 요구하는 내용을 정리하면, 맨 위의 상자를 제외한 모든 각 상자들에 대하여 해당 상자의 윗면의 범위(경계 미포함) 내부에 그 상자 위로 있는 다른 모든 상자의 \(x\)좌표의 평균이 항상 포함되는지를 판단하는 문제임을 알 수 있다.

 

위의 상자부터 연속한 각 개수의 상자의 \(x\)좌표의 합을 \(O(n)\)에 먼저 계산해두면 각 상자에 대해 위 조건을 만족하는지 판단을 \(O(n)\)에 어렵지 않게 알 수 있게 된다. 이와 같은 관찰을 이용해 문제를 해결하자.

 

글쓴이는 위 계산을 유리수 형태로 정리해 부동소수점 자료형 없이 정수 자료형만으로 마쳐 부동소수점 오차 없이 문제를 해결하였다.

 

아래는 제출한 소스코드이다.

#include <iostream>
using namespace std;
typedef long long ll;

ll N, L;
ll A[200000];
ll total;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> N >> L;
	for (int i = 0; i < N; i++) cin >> A[i];
	for (int i = N - 1, cnt = 1; i > 0; i--, cnt++) {
		total += A[i];
		if (abs(A[i - 1] * cnt - total) >= L * cnt) {
			cout << "unstable";
			return 0;
		}
	}

	cout << "stable";
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 11690 // C++] LCM(1, 2, ..., n)  (0) 2024.05.15
[BOJ 19592 // C++] 장난감 경주  (0) 2024.05.14
[BOJ 17251 // C++] 힘 겨루기  (0) 2024.05.12
[BOJ 3944 // C++] 나머지 계산  (0) 2024.05.11
[BOJ 16400 // C++] 소수 화폐  (0) 2024.05.10

+ Recent posts