USACO07DEC Gourmet Grazers

题目地址

题解

STL大法好
multiset水题
按照贪心的思想,每次给牛中对草的质量最高的安排一个草的质量比他高的,且最便宜的。
用平衡树维护即可。
时限宽松,所以用multiset暴力水过

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cctype>
#include <set>
#define INF 2000000000
using namespace std;
typedef long long ll;
multiset<int> s;
pair<int,int> P[100005],C[100005];
ll ans=0;
int n,m;
int read(){
int f=1,x=0;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-f;c=getchar();}
while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
return f*x;
}
void init(){
n=read(),m=read();
for(int i=1;i<=n;i++)C[i].second=read(),C[i].first=read();
for(int i=1;i<=m;i++)P[i].second=read(),P[i].first=read();
sort(P+1,P+m+1);
sort(C+1,C+n+1);
}
void solve(){
for(int i=n,j=m;i>=1;i--){
while(j>=1&&P[j].first>=C[i].first)
s.insert(P[j].second),j--;
if(s.empty()){
printf("-1\n");
return ;
}else{
int ans_=*s.lower_bound(C[i].second);
ans+=ans_,s.erase(s.find(ans_));
}
}
printf("%lld\n",ans);
}
int main(){
init();
solve();
return 0;
}