PS

BOJ 27447 : 주문은 토기입니까?

lickelon 2024. 6. 21. 21:09
  • 문제 링크 : boj.kr/27447
  • 난이도 : G5
  • 태그 : 그리디

코드

#include <bits/stdc++.h>

#define all(x) (x).begin(), (x).end()

#define INF 0x7FFFFFFF

using namespace std;

using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pll = pair<ll, ll>;

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    int n, m;
    cin >> n >> m;

    vector<int> cs(n);
    for(int i = 0; i < n; i++) {
        cin >> cs[i];
    }
    sort(all(cs), greater<int>());

    int l = cs[0]+1;
    vector<int> arr(l, -1);
    for(int i = 0; i < n; i++) arr[cs[i]] = 1;

    int idx = l;
    int ci = 0;
    while(ci < n && idx >= 0) {
        if(idx > cs[ci]) idx = cs[ci];
        if(arr[idx] == -1) {
            if(cs[ci] - idx <= m) {
                arr[idx] = 0;
                ci++;
            }
        }
        idx--;
    }

    int tcnt = 0;
    int ccnt = 0;
    for(int i = 0; i < l; i++) {
        if(arr[i] == -1) tcnt++;
        else if(arr[i] == 0) tcnt--, ccnt++;
        else ccnt--;

        if(tcnt < 0 || ccnt < 0) {
            cout << "fail";
            return 0;
        }
    }
    cout << "success";
    return 0;
}

풀이

타이밍과 순서에 영향을 받지 않는 행동이 딱 하나 있다. 토기를 만드는 것이다.

따라서 토기를 최대한 미리 만들어 두는 것이 이득이 될 것임을 알 수 있다.

K초에 발생할 주문을 위해 토기에 커피를 담는 것은, K-M초부터 K-1초 사이 아무때나 담아도 된다.

하지만 앞에서 발견한 사실에 따라 최대한 주문과 가까운 시간에 커피를 담아야 한다.

커피를 제공하는 행동은 정해져있으니 확인할 필요가 없다.

 

위에서 발견한 사실을 통해 가장 먼 미래의 주문부터 시간을 앞으로 당겨가며 행동을 배치하면 최적으로 행동할 수 있다.

최적으로 행동했을 때 커피를 제공하지 못한다면 fail을 출력한다.

'PS' 카테고리의 다른 글

BOJ 2668 : 숫자고르기  (0) 2024.06.23
BOJ 1689 : 겹치는 선분  (0) 2024.06.22
BOJ 25391 : 특별상  (0) 2024.06.20
BOJ 5485 : 평균값 수열  (0) 2024.06.19
BOJ 17205 : 진우의 비밀번호  (0) 2024.06.18