POJ 3622 Gourmet Grazers(贪心)
【题目链接】 http://poj.org/problem?id=3622
【题目大意】
给出一些物品拥有两个属性值,价格和精美程度
给出一些需求表示要求获得的物品两个属性值的两种属性下界,
一个物品只能用一次,问满足所有需求的最小价格。
【题解】
我们将物品和需求按照精美程度排序,这样我们就得到了价格的一个序列
我们降序处理物品,则可以保证对于当前需求,前面的所有物品均满足其精美程度的需求
这个时候我们只要找到满足条件的最低价格来供给这个需求,就一定是最优的,
对于最优情况的查找,我们用平衡树来维护。
【代码】
#include <cstdio> #include <algorithm> #include <set> using namespace std; typedef long long LL; const int N=100000; struct data{int x,y;}p[N],u[N]; int n,m; bool cmp(data a,data b){return a.y>b.y;} void solve(){ LL ans=0; int j=0,flag=1; for(int i=0;i<n;i++)scanf("%d%d",&p[i].x,&p[i].y); for(int i=0;i<m;i++)scanf("%d%d",&u[i].x,&u[i].y); sort(p,p+n,cmp); sort(u,u+m,cmp); multiset<int> M; for(int i=0;i<n;i++){ while(j<m&&u[j].y>=p[i].y)M.insert(u[j++].x); multiset<int>::iterator it=M.lower_bound(p[i].x); if(it==M.end()){flag=0;break;} else{ans+=*it;M.erase(it);} }printf("%lld\n",flag?ans:-1); } int main(){ while(~scanf("%d%d",&n,&m))solve(); return 0; }
愿你出走半生,归来仍是少年