본문 바로가기

PS/boj

백준 23022 숙제 (C++)

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

 

23022번: 숙제

Albert는 앞으로 n개의 숙제를 해야한다 (편의상 1번부터 n번까지 번호가 붙어있다). 현재 시각은 S 이고, i번째 숙제의 내용은 정해진 시각 t[i]에 공개 된다 (어떤 숙제는 이미 공개 되었지만 Albert

www.acmicpc.net

우선순위 큐를 사용하는 문제였습니다. 시간순으로 숙제를 정렬 한후 앞에서부터 스위핑하면서 현재시간(초기에는 S)

기준으로 작으면 큐에 넣고 현재시간보다 뒤의 숙제가 나온다면 현재시간을 증가시켜가며 큐에서 빼면됩니다. 그러다가 증가시키면서 지금보고있는 숙제시간의 시간과 같아진다면 현재 숙제를 큐에넣고 다음 숙제로 넘어가면 됩니다. 

#include<stdio.h>
#include<vector>
#include<algorithm>
#include<string>
#include<iostream>
#include<map>
#include<set>
#include<stack>
#include<queue>
#include<functional>
using namespace std;
void fast_io() {
  cin.tie(0)->sync_with_stdio(0);
}
bool comp(const pair<long long,long long> &a,const pair<long long,long long> &b){
    if(a.first==b.first){
        return a.second<=b.second;
    }
    return a.first<=b.first;
}
int main(){
    fast_io();
    int T;
    cin>>T;
    while(T--){
        int N,S;
        cin>>N>>S;
        priority_queue<pair<long long,long long>> pq;
        vector<long long> t(N,0);
        for(auto & i:t){
            cin>>i;
        }
        vector<pair<long long,long long>> tv;
        for(int x=0;x<N;x++){
            long long input;
            cin>>input;
            tv.push_back({t[x],input});
        }
        sort(tv.begin(),tv.end());
        int now=S;
        long long solve=0;
        for(int x=0;x<N;x++){
            if(tv[x].first<=now){
                pq.push({tv[x].second,tv[x].first});
            }
            else{
                int temp=now;
                while(!pq.empty()){
                    if(temp==tv[x].first){
                        break;
                    }
                    solve+=pq.top().first * (temp-pq.top().second);
                    temp++;
                    pq.pop();
                }
                now=tv[x].first;
                pq.push({tv[x].second,tv[x].first});
            }
        }
        while(!pq.empty()){
            solve+=pq.top().first * (now-pq.top().second);
            pq.pop();
            now++;
        }
        cout<<solve<<'\n';
    }
}

'PS > boj' 카테고리의 다른 글

백준 1786 찾기 (C++)  (0) 2022.07.04
백준 4817 괄호 (C++)  (0) 2022.07.03
백준 16882 카드게임 (C++)  (0) 2022.07.01
백준 21940 가운데에서 만나기 (C++)  (0) 2022.06.30
백준 16117 실버런 (C++)  (0) 2022.06.29