poj 3622 贪心,multiset
装死好一阵子了,考研压力山大。
好吧,其实做题的时间只是被游戏占用了。
点开一道水题poj3622。
一看就是贪心嘛。
每次用最便宜的食物看能不能满足某只牛。如果能满足多只牛,就选greenness score需求最大的那只牛。显然正确就不作证明了。
这样就要用到一个平衡树找到现有牛中Bj小于等于食物Di最大的那只。
multiset::lower_bound轻松满足要求。
STL威武,代码短时间也不慢呀有木有。
双关键字的问题常用排序某关键字,另一个作为数据结构的关键字插入取出。(什么你们早就知道了。。。)
装死好一阵子了,考研压力山大。
好吧,其实做题的时间只是被游戏占用了。
点开一道水题poj3622。
一看就是贪心嘛。
每次用最便宜的食物看能不能满足某只牛。如果能满足多只牛,就选greenness score需求最大的那只牛。显然正确就不作证明了。
这样就要用到一个平衡树找到现有牛中Bj小于等于食物Di最大的那只。
multiset::lower_bound轻松满足要求。
STL威武,代码短时间也不慢呀有木有。
双关键字的问题常用排序某关键字,另一个作为数据结构的关键字插入取出。(什么你们早就知道了。。。)
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<set>
using namespace std;
#define NN 101000
struct node{
int a,b;
bool operator <(const node &y)const{
return b>y.b;
}
}a[NN],w[NN],tn;
bool cmp(const node &a,const node &b){
return a.a<b.a;
}
int main(){
int n,m,i,tot,p;
scanf("%d%d",&n,&m);
for(i=1;i<=n;++i){
scanf("%d%d",&a[i].a,&a[i].b);
}
for(i=1;i<=m;++i){
scanf("%d%d",&w[i].a,&w[i].b);
}
multiset<node> st;
multiset<node>::iterator it;
sort(a+1,a+n+1,cmp);
sort(w+1,w+m+1,cmp);
tot=0;
p=1;
long long ans=0;
for(i=1;i<=m;++i){
while (p<=n&&a[p].a<=w[i].a) {st.insert(a[p]);++p;}
it=st.lower_bound(w[i]);
if (it!=st.end()) {
st.erase(it);
tot++;
ans+=w[i].a;
}
if (tot==n) break;
}
if (tot==n) printf("%I64d\n",ans);
else printf("-1\n");
return 0;
}