POJ3614防晒霜 这个贪心有点东西(贪心+优先队列)

时间:2022-07-28
本文章向大家介绍POJ3614防晒霜 这个贪心有点东西(贪心+优先队列),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

这个题是说有C头牛去晒太阳,带了L瓶防晒霜,每瓶防晒霜都有一个SPF值(每瓶防晒霜都能解决一个最短路 ) 每头牛给出了他可以接受防晒霜的上限,和下限,每种防晒霜都给出了SPF值与数量。 从防晒霜的spf值最小开始贪心,每次将奶牛最大接受限度小的牛且符合条件选出,那么这头牛一定比其他牛接受范围更小,应该优先选择。

#include <bits/stdc++.h>
using namespace std;
const int maxn=3000;
struct cow
{
    int maxi;
    int mini;
    bool operator <(const cow & w)const
    {
        if(maxi==w.maxi)    return mini<w.mini;
        return maxi>w.maxi;
    }
    bool operator ==(const cow & w)const
    {
        if(maxi==w.maxi&&mini==w.mini)    return 1;
        return 0;
    }
} w ;
struct spf
{
    int sp;
    int nu;
    bool operator <(const spf& w)const
    {
        return sp>w.sp;
    }
} x;
int n,m,ans;
priority_queue<spf> s;
cow c[maxn];
priority_queue<cow>cw;
int main()
{
    cin>>n>>m;
    for(int i=0;i<n;i++)
        cin>>c[i].mini>>c[i].maxi;
    for(int i=0;i<m;i++)
        cin>>x.sp>>x.nu,s.push(x);
//    cout<<(s.top().sp)<<endl;
    while(!s.empty())
    {
        spf tem=s.top();
        s.pop();
        while(!cw.empty())cw.pop();
        for(int i=0;i<n;i++)
        {
            if(c[i].mini<=tem.sp&&c[i].maxi>=tem.sp)
            cw.push(c[i]);
        }
        if(!cw.empty()){
            cow temp=cw.top();
            c[find(c,c+n,temp)-c].maxi=-99;
            ans++;
            tem.nu--;
            if(tem.nu!=0) s.push(tem);
        }
        else ;
        if(ans==n) break;
    }
    cout<<ans<<endl;
}