Algorithm/BOJ

KOI 2019 1차 고등부 1번 / 쇼핑몰 - 17612

jhg0406 2020. 8. 24. 13:08
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <iostream>
#include <queue>
using namespace std;
 
int N, K;
 
struct Casher {
    int idx;
    int rest;
};
 
struct Mem {
    int mnum;
    int otime;
    int cidx;
};
 
bool operator<(const Casher& c1, const Casher& c2) {
    if(c1.rest == c2.rest) return c1.idx < c2.idx;
    return c1.rest < c2.rest;
}
 
bool operator<(const Mem& n1, const Mem& n2) {
    if(n1.otime == n2.otime) return n1.cidx < n2.cidx;
    return n1.otime < n2.otime;
}
 
priority_queue<Casher> cpq;
priority_queue<Mem> mpq;
 
int main() {
    ios_base::sync_with_stdio(0), cin.tie(0);
    cin >> N >> K;
    for(int i = 0; i<K; ++i) {
        Casher c;
        c.idx = -i; c.rest = 0;
        cpq.push(c);
    }
 
    for(int i = 0; i<N; ++i) {
        Mem m;
        int stnum;
        cin >> m.mnum >> stnum;
        Casher c = cpq.top();
        cpq.pop();
        c.rest -= stnum;
        m.otime = c.rest;
        m.cidx = -c.idx;
        cpq.push(c);
        mpq.push(m);
    }
 
    long long ans = 0;
    int mul = 1;
    while(!mpq.empty()) {
        Mem m = mpq.top();
        mpq.pop();
        ans += (long long)m.mnum*(long long)mul++;
    }
    cout << ans;
}
cs

 

 

 

 

 

https://www.acmicpc.net/problem/17612

 

17612번: 쇼핑몰

입력의 첫 줄에는 2개의 정수 N(1 ≤ N ≤ 100,000)과 k(1 ≤ k ≤ 100,000)가 주어진다. 다음 줄부터 N개의 줄에 걸쳐 고객 N명의 정보가 줄 맨 앞의 고객부터 맨 뒤 고객까지 순서대로 주어진다. i번째 ��

www.acmicpc.net

 

 

 

 

 

쇼핑몰

우선순위 큐 두개를 이용해 하나는 현재 이용할 수 있는 계산대를 구하기 위해 사용하고,

다른 하나는 고객들이 나가는 순서를 구하기 위해 사용하면 됩니다.