작성일 :

문제 링크

31533번 - Furiosa AI 영상 처리 가속

설명

두 개의 영상 처리 작업을 가장 빠르게 완료하기 위한 최소 시간을 구하는 문제입니다.

  • 각각의 영상 작업을 처리하는 데 걸리는 시간은 m, n입니다.
  • 두 사람은 각자 컴퓨터를 갖고 있으며, 한 대의 컴퓨터에만 a배 빠르게 처리할 수 있는 가속기를 장착할 수 있습니다.
  • 각 컴퓨터는 동시에 하나의 작업만 처리할 수 있고, 작업을 나누거나 중단할 수 없습니다.

두 작업을 어떻게 배분하고, 어느 쪽에 가속기를 적용할지에 따라 전체 소요 시간이 달라집니다.

이를 고려하여 모든 작업을 마치는 데 걸리는 최소 시간을 계산해야 합니다.


접근법

작업 시간 m, n 중 작은 값을 먼저 m, 큰 값을 n이라 두고, 다음 두 가지 전략을 비교합니다:

  • 전략 1. 병렬 처리
    두 작업을 각각 다른 컴퓨터에서 동시에 수행합니다.

    느린 작업 쪽에 가속기를 장착하여 속도를 a배 향상시키고, 나머지 작업은 일반 속도로 진행합니다.

    두 작업이 동시에 시작되므로, 전체 소요 시간은 둘 중 더 오래 걸리는 작업 시간입니다.

    \[\text{시간}_1 = \max\left(m,\frac{n}{a}\right)\]
  • 전략 2. 직렬 처리
    두 작업을 모두 한 컴퓨터에서 순서대로 수행하며, 해당 컴퓨터에 가속기를 장착합니다.

    두 작업 시간의 합을 a로 나눈 값이 전체 소요 시간이 됩니다.

    \[\text{시간}_2 = \frac{m + n}{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;
}