雕刻时光

just do it……nothing impossible
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

贪心+STL—— [Usaco2007 Dec]挑剔的美食家

Posted on 2011-09-13 22:13  huhuuu  阅读(450)  评论(0编辑  收藏  举报

思想是按草的新鲜程度作为第一关键词,前作为第二关键词排序(因为要取钱较少的,所以草鲜嫩排第一)

multiset 储存符合第二关键词的 所有第一关键词,取合理且最小的第一关键词累积

View Code
#include<stdio.h>
#include
<algorithm>
#include
<iostream>
#include
<vector>
#include
<set>
using namespace std;

int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
vector
<pair<int,int> > ve;
vector
<pair<int,int> > ve1;

int i,j,a,b;
for(i=0;i<n;i++)
{
scanf(
"%d%d",&a,&b);
ve.push_back(make_pair(b,a));
}
for(i=0;i<m;i++)
{
scanf(
"%d%d",&a,&b);
ve1.push_back(make_pair(b,a));
}

sort(ve.begin(),ve.end());
sort(ve1.begin(),ve1.end());

multiset
<int>set1;
int ok=0;
long long all=0;
j
=m-1;
for(i=n-1;i>=0;i--)
{
for(;j>=0;)
{
if(ve1[j].first>=ve[i].first)
{
set1.insert(ve1[j].second);
j
--;
}
else
{
break;
}
}
if(set1.size()==0)
{
printf(
"-1\n");
ok
=1;
break;
}
multiset
<int>::iterator p= set1.lower_bound(ve[i].second);
//cout<<" "<<*p;
all+=*p;
set1.erase(p);
}

if(ok==0)
{
printf(
"%lld\n",all);
}
}

return 0;
}