https://www.acmicpc.net/problem/23022
우선순위 큐를 사용하는 문제였습니다. 시간순으로 숙제를 정렬 한후 앞에서부터 스위핑하면서 현재시간(초기에는 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 |