개인공부용123 프로그래밍 블로그

AlgoSpot) POTION 본문

알고리즘문제

AlgoSpot) POTION

개인공부용123 2017. 2. 20. 22:07

문제 : https://algospot.com/judge/problem/read/POTION


마법의 약을 만드는데 넣어야할 재료의 최소량을 구하는 문제입니다.

유클리드알고리즘을 이용해서 마법의 약을 만드는데 필요한 재료들의 최소공배수를 찾은후 

가지고있는 모든 재료들중 가장 높은 비율로 나머지 재료들을 맞춰야합니다.

이떄 이 비율의 분모는 최소공배수여야합니다 왜냐하면 맞춰진 재료들이 정수여야하기때문입니다.




#include <iostream>
#include <algorithm>
using namespace std;

int n; // 재료의수

int recipe[200];
int cur[200];
int answer[200];

int gcd(int a, int b) {
	if (a < b) swap(a, b);
	return b == 0 ? a : gcd(b, a % b);
}

int upInt(int a, int b) {
	if (a % b == 0) return a / b;
	else return (a / b + 1);
}

void solve() {
	int b = recipe[0]; // 분모
	for (int i = 1; i < n; ++i) b = gcd(b, recipe[i]);
	
	int a = b; // 분자 
	for (int i = 0; i < n; ++i) a = max(a, upInt(cur[i] * b, recipe[i]));
	
	for (int i = 0; i < n; ++i) answer[i] = recipe[i] * a / b - cur[i];
}

int main() {
	std::ios::sync_with_stdio(false);

	int C;
	cin >> C;

	while (C--) {
		cin >> n;

		for (int i = 0; i < n; ++i) cin >> recipe[i];
		
		for (int i = 0; i < n; ++i) cin >> cur[i];
		
		solve();
		for (int i = 0; i < n; ++i) cout << answer[i] << " ";
		cout << endl;
	}
	return 0;
}


'알고리즘문제' 카테고리의 다른 글

AlgoSpot) GRADUATION  (0) 2017.03.16
AlgoSpot) PASS486  (0) 2017.02.20
AlgoSpot) RATIO  (0) 2017.02.13
AlgoSpot) LOAN  (0) 2017.02.07
AlgoSpot) CANADATRIP  (0) 2017.02.06