[백준 24867] Два станка (C#, C++) - soo:bak
작성일 :
문제 링크
설명
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;
}