본문 바로가기
PS/BOJ

백준 21761 / C++

by jaehoonChoi 2022. 8. 8.

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

 

21761번: 초직사각형

1차원 공간에서의 선분, 2차원 공간에서의 직사각형, 3차원 공간에서의 직육면체를 생각해 보자. 선분의 크기는 변수 $A$로, 직사각형의 크기는 두 개의 변수 $A$와 $B$로, 직육면체의 크기는 세 개

www.acmicpc.net

 

[ 풀이 ] 

부피 ABCD에서 한 변을 증가시키면 (A+U)BCD가 된다.

그럼 매번 변화시키면서 1+U/A가 커지도록 해주면 된다. 

그리디하게 매번 A,B,C,D중 제일 큰 U를 뽑아서  1+U/x가 제일 큰걸 매번 뽑아주면 된다.

기존 ABCD에서 이렇게 가장 큰 비율을 매번 곱해줘야 최대가 되는건 자명하다.

그 비율이 1보다 크기 때문에 항상 값이 커지기 때문이다.

매번 제일 큰 뭔가를 뽑고 1번쓰고 버리는건 pq를 써주자.

시간복잡도는 O(N+4KlogN)이 된다. 

 

[ Code ] 

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
ll n, k, x[4];
priority_queue<ll>pq[4];

int main() {
	ios::sync_with_stdio(0), cin.tie(0);
	cin >> n >> k;
	// A, B, C, D의 처음 값 
	for (int i = 0; i < 4; i++) cin >> x[i];
	// pq[i]: A,B,C,D의 U값 저장 
	for (int i = 0; i < n; i++) {
		char T; ll u;
		cin >> T >> u;
		pq[T - 'A'].push(u);
	}
	while (k--) {
		int idx = -1;
		double temp = -1;
		for (int i = 0; i < 4; i++) {
			if (pq[i].empty())continue;
			// 비율 큰걸 고름 
			double w = (double)pq[i].top() / (double)x[i];
			if (temp < w) {
				temp = w;
				idx = i;
			}
		}
		// 그 선분 업데이트
		x[idx] += pq[idx].top();
		cout << "ABCD"[idx] << " " << pq[idx].top() << '\n';
		pq[idx].pop(); // U값 제거 
	}
}

 

 

'PS > BOJ' 카테고리의 다른 글

백준 3830 / C++  (0) 2022.08.12
백준 2873 / C++  (0) 2022.08.12
백준 1234 / C++  (0) 2022.08.08
백준 25315 / C++  (0) 2022.08.08
백준 14908 / C++  (0) 2022.08.05

댓글