主要是STL的应用吧。。。
题意:
有很多种草,有两个属性:价格和新鲜度;有很多牛,它们都会各自需求一种草,要求是其价格最低为ai,新鲜度最低为bi,且这些牛不希望自己的草和别人的一样。问要满足所有需求的最小花费是多少?
题解:
大概是贪心吧。。这种东西还算比较明显吧。。
想不到的算法大概都是贪心或者二分答案?
所以我们把牛的挑剔程度排个序。然后把每种草再排个序。然后枚举每一个牛将符合条件的草的价钱扔进multiset,然后找第一个>=当前牛要求价钱的,删掉。
复杂度的话。不是很会算。
大概O((n+m)logm)的?(⊙o⊙)
所以这篇主要目的,是讲STL应用–multiset
其实大部分操作是和set一样的。
这里用到了插入 insert;
返回 lower_bound;
清除erase();
#include<cstdio>
#include<cstring>
#include<set>
#include<algorithm>
#define int long long
using namespace std;
//by mars_ch
int n,m;
multiset<int> mt;
struct data
{
int a,b;
}c[100005];
struct node
{
int a,b;
}g[100005];
bool cmp1(data a,data b)
{
return a.b>b.b;
}
bool cmp2(node a,node b)
{
return a.b>b.b;
}
signed main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&c[i].a,&c[i].b);
}
for(int i=1;i<=m;i++)
{
scanf("%d%d",&g[i].a,&g[i].b);
}
sort(c+1,c+n+1,cmp1);
sort(g+1,g+m+1,cmp2);
int p=1;
int ans=0;
for(int i=1;i<=n;i++) //枚举每一头牛
{
while(c[i].b<=g[p].b && p<=m)
{
mt.insert(g[p++].a);
}
multiset<int>::iterator it=mt.lower_bound(c[i].a);
if(it==mt.end()) //没有元素返回的为指针
{
printf("%d\n",-1);
return 0;
}
ans+=*it;
mt.erase(it);
}
printf("%lld\n",ans);
return 0;
}