작성일 :

문제 링크

15115번 - Delayed Work

설명

페인터 수를 정해 작업 비용과 지연 패널티 합이 최소가 되도록 하는 문제입니다.


접근법

고용 인원 M이 늘면 인건비는 증가하고, 작업 시간은 줄어 패널티가 감소합니다.
M이 정수이므로 일정 범위의 M을 모두 확인해 최소값을 찾으면 됩니다.
비용은 M*X + (K/M)*P 형태이며, M은 1부터 적당히 넓은 범위에서 검사하면 충분합니다.


Code

C#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using System;

class Program {
  static void Main() {
    var parts = Console.ReadLine()!.Split();
    var k = double.Parse(parts[0]);
    var p = double.Parse(parts[1]);
    var x = double.Parse(parts[2]);

    var best = double.MaxValue;
    for (var m = 1; m <= 100000; m++) {
      var cost = m * x + (k / m) * p;
      if (cost < best) best = cost;
    }

    Console.WriteLine(best.ToString("0.000"));
  }
}

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <bits/stdc++.h>
using namespace std;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  double k, p, x;
  cin >> k >> p >> x;

  double best = 1e100;
  for (int m = 1; m <= 100000; m++) {
    double cost = m * x + (k / m) * p;
    if (cost < best) best = cost;
  }

  cout << fixed << setprecision(3) << best << "\n";

  return 0;
}