LOPOV 题解
难度:黄
做法:贪心
定义:
推导一:对于当前要装入袋子中的物品
对于两个
显然是不需要的,假设当前两个值有不是最优解的,那么可以找到一个比它更优的解来替代。直至物品
根据推导一,我们可以发现,对于当前解
我们考虑先按照
我们可以维护
先讲袋子容量插入
附代码:
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<cstdio>
#include<algorithm>
#include<set>
using namespace std;
const int maxn(3e5+5);
long long n,m,x;
long long ans=0;
struct node{ int w,v; }a[maxn];
multiset <int> s;
int read(){
char ch=getchar();
int x=0,f=1;
while(ch<'0' || ch>'9') {if(ch=='-')f=-1;ch=getchar();}
while(ch>='0' && ch<='9') {x=x*10+ch-'0';ch=getchar();}
return x*f;
}
bool cmp(node x,node y){ return x.v>y.v; }
int main(){
n=read(),m=read();
for(int i=1;i<=n;i++) a[i].w=read(),a[i].v=read();
for(int i=1;i<=m;i++) x=read(),s.insert(x);
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++){
multiset<int>::iterator k=s.lower_bound(a[i].w);
if(k!=s.end()) s.erase(k),ans+=a[i].v;
}
printf("%lld\n",ans);
return 0;
}
总结:这道题实现上还是比较水的,学贪心的朋友可以练练手,学平衡树和
(请不要帮助小偷!)