Skip to content

M02431: Expedition

heap,greedy, http://cs101.openjudge.cn/practice/02431/

【姚博骞 25物院】思路:构建一个堆,永远只吃堆里面最多的那个 其实有点后悔贪心的想法。

cpp
#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
int main()//greedy heap
{
    int n;
    cin>>n;
    vector<pair<int,int>> stop;
    for(int i=0;i<n;i++)
    {
        int p,q;
        cin>>p>>q;
        stop.push_back({p,q});
    }
    int l,p;
    cin>>l>>p;
    sort(stop.begin(),stop.end(),[](pair<int,int> &a,pair<int,int> &b){
        return a.first>b.first;
    });
    priority_queue<int> pq;//大顶堆;
    int ans=0;
    int i=0;
    int dist=l-p;
    while(i<n&&dist>0)
    {
        while(i<n&&stop[i].first>=dist)
        {
            pq.push(stop[i].second);
            i++;
        }
        if(pq.empty()) break;
        dist-=pq.top();
        pq.pop();
        ans++;
    }
    if(dist<=0)
    {
        cout<<ans;
    }
    else
    {
        cout<<-1;
    }
    return 0;
}