CSU 1089 羊吃草

来源:互联网 发布:国际提单查询网站知乎 编辑:程序博客网 时间:2024/04/28 03:03
很不错的优先队列题。
有N只羊,他们要吃草料,商店有M种草料,每种草料只能给一只羊吃。草料有价格price和质量score两种特性,每只羊对两种特性都有最低要求。
要求在满足质量,每只羊都能吃到的前提下,求出最小总价;

思路:先把草料和羊按质量从大到小排序,遍历羊,将大于羊要求的质量(即符合要求的草料入队),在队列中按价格从小到大排列,然后找到价格恰满足此羊的草料,出队,加入总价。

//Memory: 4228 KB//Time: 992 MS#include<iostream>#include<algorithm>#include<stdio.h>#include<set>using namespace std;#define N 100100struct mess{    int p;    int s;};mess m1[N],m2[N];bool cmp(const mess & m1,const mess & m2){    return m1.s>m2.s;}bool operator <(const mess & m1,const mess & m2){    return m1.p<m2.p;}int main(){    int n,m;    while(scanf("%d%d",&n,&m)!=EOF)    {        int i,j;         multiset<mess> sm;        //memset(m2,0,sizeof(m2));        for(i=0;i<n;i++)            scanf("%d%d",&m1[i].p,&m1[i].s);        for(i=0;i<m;i++)            scanf("%d%d",&m2[i].p,&m2[i].s);        sort(m1,m1+n,cmp);        sort(m2,m2+m,cmp);        long long cost=0;        j=0;        int flag=0;        for(i=0;i<n;i++)        {            while(1)            {                if(m2[j].s>=m1[i].s)                      sm.insert(m2[j]);    //加入优先队列                else                    break;                j++;            }            if(!sm.empty())            {                multiset<mess>::iterator pos;                pos=sm.lower_bound(m1[i]);   //找到满足要求的草料if(pos!=sm.end()){cost+=pos->p;sm.erase(pos);}else{flag=1;break;}            }else{flag=1;break;}        }        if(flag)            printf("-1\n");        else printf("%lld\n",cost);     }    return 0;}


原创粉丝点击