[백준 31533] Furiosa AI 영상 처리 가속 (C#, C++) - soo:bak
작성일 :
문제 링크
설명
두 개의 영상 처리 작업을 가장 빠르게 완료하기 위한 최소 시간을 구하는 문제입니다.
- 각각의 영상 작업을 처리하는 데 걸리는 시간은
m
,n
입니다. - 두 사람은 각자 컴퓨터를 갖고 있으며, 한 대의 컴퓨터에만
a
배 빠르게 처리할 수 있는 가속기를 장착할 수 있습니다. - 각 컴퓨터는 동시에 하나의 작업만 처리할 수 있고, 작업을 나누거나 중단할 수 없습니다.
두 작업을 어떻게 배분하고, 어느 쪽에 가속기를 적용할지에 따라 전체 소요 시간이 달라집니다.
이를 고려하여 모든 작업을 마치는 데 걸리는 최소 시간을 계산해야 합니다.
접근법
작업 시간 m
, n
중 작은 값을 먼저 m
, 큰 값을 n
이라 두고, 다음 두 가지 전략을 비교합니다:
-
전략 1. 병렬 처리
\[\text{시간}_1 = \max\left(m,\frac{n}{a}\right)\]
두 작업을 각각 다른 컴퓨터에서 동시에 수행합니다.
느린 작업 쪽에 가속기를 장착하여 속도를a
배 향상시키고, 나머지 작업은 일반 속도로 진행합니다.
두 작업이 동시에 시작되므로, 전체 소요 시간은 둘 중 더 오래 걸리는 작업 시간입니다. -
전략 2. 직렬 처리
\[\text{시간}_2 = \frac{m + n}{a}\]
두 작업을 모두 한 컴퓨터에서 순서대로 수행하며, 해당 컴퓨터에 가속기를 장착합니다.
두 작업 시간의 합을a
로 나눈 값이 전체 소요 시간이 됩니다.
두 전략 중 더 짧은 시간을 선택하여 출력합니다.
Code
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
using System.Text;
class Program {
static void Main() {
double a = double.Parse(Console.ReadLine());
var tokens = Console.ReadLine().Split();
double m = double.Parse(tokens[0]);
double n = double.Parse(tokens[1]);
if (m > n) (m, n) = (n, m);
double result = Math.Min(m * 2 / a, Math.Max(m, n / a));
var sb = new StringBuilder();
sb.AppendFormat("{0:F7}", result);
sb.AppendLine();
Console.WriteLine(sb.ToString());
}
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
double a, m, n; cin >> a >> m >> n;
if (m > n) swap(m, n);
double result = min(m * 2 / a, max(m, n / a));
cout << fixed << setprecision(7) << result << "\n";
return 0;
}