작성일 :

문제 링크

24867번 - Два станка

설명

k분의 교대 시간 동안 두 기계를 가동합니다. 기계1은 시동에 a분이 걸리고 이후 분당 x개를 생산하며, 기계2는 시동에 b분이 걸리고 이후 분당 y개를 생산합니다.

두 기계의 시동은 동시에 할 수 없지만, 이미 켜진 기계는 다른 기계를 시동하는 동안에도 생산할 수 있습니다. 최대 생산량을 구하는 문제입니다.


접근법

먼저, 두 기계의 시동 순서는 두 가지뿐입니다. 기계1을 먼저 켜거나, 기계2를 먼저 켜는 경우입니다.

다음으로, 기계1을 먼저 켜는 경우를 계산합니다. a분 후부터 기계1이 생산을 시작하고, a+b분 후부터 기계2도 생산을 시작합니다. 따라서 기계1은 k-a분 동안, 기계2는 k-a-b분 동안 생산합니다.

이후, 기계2를 먼저 켜는 경우도 대칭적으로 계산합니다. 두 경우 중 더 큰 값이 답이 됩니다.

값이 매우 커질 수 있으므로 64비트 정수를 사용합니다.


Code

C#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using System;

namespace Solution {
  class Program {
    static void Main(string[] args) {
      var k = long.Parse(Console.ReadLine()!);

      var l1 = Console.ReadLine()!.Split();
      var a = long.Parse(l1[0]);
      var x = long.Parse(l1[1]);

      var l2 = Console.ReadLine()!.Split();
      var b = long.Parse(l2[0]);
      var y = long.Parse(l2[1]);

      var order1 = 0L;
      if (k > a)
        order1 = x * (k - a) + y * Math.Max(0, k - a - b);

      var order2 = 0L;
      if (k > b)
        order2 = y * (k - b) + x * Math.Max(0, k - b - a);

      Console.WriteLine(Math.Max(order1, order2));
    }
  }
}

C++

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

typedef long long ll;

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

  ll k; cin >> k;
  ll a, x; cin >> a >> x;
  ll b, y; cin >> b >> y;

  ll order1 = 0;
  if (k > a)
    order1 = x * (k - a) + y * max(0LL, k - a - b);

  ll order2 = 0;
  if (k > b)
    order2 = y * (k - b) + x * max(0LL, k - b - a);

  cout << max(order1, order2) << "\n";

  return 0;
}