본문 바로가기

ps(알고리즘)

보석 도둑

간단한 문제이다.

그리디 알고리즘을 쓰면 된다.

최대 무게가 작은 가방부터 보면서 담을 수 있는 보석 중에 가격이 젤 높은 보석을 담으면 된다.

가방 개수가 K개인데 가방마다 보석 N개를 전부 조사하면 O(NK)로 시간이 너무 오래 걸리니까

보석도 무게가 작은거부터 스택에 넣어두고 스택을 유지하면서 top을 담으면 된다.

#include<stdio.h>
#include<queue>
#include<algorithm>
using namespace std;
int N,K;
long long bag[400005];
struct Data{
    long long m,v;
    bool operator<(const Data &r) const{
        return m < r.m;
    }
}jewel[400005];
priority_queue<long long> values;
int main()
{
    scanf("%d %d",&N,&K);
    for(int i=1;i<=N;i++)
    {
        scanf("%lld %lld",&jewel[i].m, &jewel[i].v);
    }
    for(int i=1;i<=K;i++)
    {
        scanf("%lld",&bag[i]);
    }
    sort(bag+1,bag+K+1);
    sort(jewel+1,jewel+N+1);
    int j=1;
    long long ans=0;
    for(int i=1;i<=K;i++)
    {
        while(jewel[j].m<=bag[i] && j<=N){
            values.push(jewel[j].v);
            j++;
        }
        if(!values.empty()){
            ans+=values.top();
            values.pop();
        }
    }
    printf("%lld",ans);
}

코드이다. 계속 런타임 에러가 생겨서 맞왜틀 고쳤는데 에러 발생 이유는 스택이 비었을 때 top과 pop 함수를 실행해서였다. 그래서 if(!values.empty())를 추가해서 고쳤다.

'ps(알고리즘)' 카테고리의 다른 글

피보나치 수 6  (0) 2024.07.17
문제집  (0) 2024.07.17
후위 표기식  (0) 2024.07.13
가운데를 말해요  (0) 2024.06.26
가장 긴 증가하는 부분 수열 2  (0) 2024.06.26