思想是按草的新鲜程度作为第一关键词,前作为第二关键词排序(因为要取钱较少的,所以草鲜嫩排第一)
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;
}