본문 바로가기
PS/BOJ

백준 14908 / C++

by jaehoonChoi 2022. 8. 5.

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

 

14908번: 구두 수선공

최소 보상금을 지불하는 작업 순서를 출력해야 한다. 모든 작업은 입력에서의 번호(1~N)로 표시해야 한다. 모든 정수는 한 줄로 표시해야 하며, 각 작업은 공백 문자로 구분한다. 여러 가지 해답

www.acmicpc.net

 

[ 풀이 ] 

(T1 S1) (T2 S2) ... (Tn Sn) 이 최적해라고 가정하자. 

이제 (T1 S1) (T2 S2)를 교환했을 때 값을 구해서 비교하자.

양식의 차를 비교하면 1식-2식 = T1S2-T2S1이 되고 최적해조건에 따라  T1S2 < T2S1을 만족해야 한다.

즉, T1/S1 < T2/S2 이다. 

중간에 있는 (Ti Si)와 (Ti+1, Si+1)을 교환했을 때도 다 소거되고 마찬가지로 위와 같은 차이만 남게된다. 

따라서 T/S를 오름차순 정렬한 인덱스가 답이 된다.

 

[ Code ]

#include <bits/stdc++.h>
using namespace std;
pair<double, int> a[1001];

int main() {
	ios::sync_with_stdio(0); cin.tie(0);
	int n; cin >> n;
	for (int i = 0; i < n; i++) {
		double T, S; cin >> T >> S;
		a[i] = { T / S , i + 1 };
	}
	sort(a, a + n);
	for (int i = 0; i < n; i++) {
		cout << a[i].second << " ";
	}
}

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

백준 1234 / C++  (0) 2022.08.08
백준 25315 / C++  (0) 2022.08.08
백준 10277 / C++  (0) 2022.08.05
백준 3172 / C++  (0) 2022.08.04
백준 1086 / C++  (0) 2022.08.04

댓글