본문 바로가기

백준

[백준/c++] BJO 26215 - 눈 치우기

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

 

26215번: 눈 치우기

집 2와 집 3 앞의 눈을 치우고, 집 2와 집 3 앞의 눈을 치우고, 집 1과 집 3 앞의 눈을 치운 뒤 집 3 앞의 눈을 두 번 치우면 5분만에 모든 집 앞의 눈을 치울 수 있다.

www.acmicpc.net

 

문제 설명

집의 수 N이 주어진다. 각각의 집 앞에는 눈이 쌓여 있다. 집 앞에 눈을 치우려고 하는데, 눈을 치울 때는 한번에 두 집을 선택하여 각각 1만큼 치우거나 한 집을 선택해서 그 집만 1만큼 치울 수 있다.

눈을 전부 치울 때까지 걸리는 최소 시간은? 단, 24시간 (1440분)이 넘게 걸릴 경우, -1을 출력한다.

N (1 <= N <= 100)

눈의 양 a (1 <= a <= 2000)

 

해결

눈을 최소 시간 안에 치워야 하므로, 당연히 한집만 골라서 치우는 것보다 두 집을 골라 치우는 것이 이득이다.

눈이 가장 많은 집과 두번째로 많은 집을 선택해 두 집을 동시에 치운다.

두번째로 많은 집이 존재하지 않는다면, 눈이 쌓인 유일한 집만 눈을 치우면 된다.

 

1440분이 넘어가는 경우는 예외로 빼 주었다.

 

 

코드

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;

int n;
vector<int> v;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	
	cin >> n;
	for (int i = 0; i < n; i++) {
		int a;
		cin >> a;
		v.push_back(a);
	}

	if (n == 1) {
		if (v[0] <= 1440) {
			cout << v[0];
			return 0;
		}
		cout << "-1";
		return 0;
	}

	int ans = 0;
	while (1) {
		sort(v.begin(), v.end());

		if (v[n - 1] == 0) break;

		v[n - 1]--;
		if (v[n - 2]) v[n - 2]--;
		ans++;

		if (ans > 1440) {
			cout << "-1";
			return 0;
		}
	}
	cout << ans;
}

'백준' 카테고리의 다른 글

[백준/c++] BOJ 1449 - 수리공 항승  (0) 2023.09.28
[백준/c++] BOJ 16197 - 두 동전  (1) 2023.09.28
[백준/c++] BOJ 11508 - 2+1세일  (0) 2023.09.19
[백준/c++] BOJ 20310 - 타노스  (0) 2023.09.19
[백준/c++] BOJ 12886 - 돌 그룹  (0) 2023.09.19