SP16409

思路

我们可以发现一个规律就是我们对于一个袋子一定要放能往其中放中的价值最大的那一个,那么我们就可以得到一种贪心思路。我们先将 \(c\) 从小到大排序然后再讲袋子的重量从小到大排序,然后我们就可以用双指针了。

我们用一个大根堆来存能被当前袋子装下的最大价值,然后这里我们可以用大根堆处理即可。

细节见代码。

代码

#include <bits/stdc++.h>
using namespace std ;
#define int long long
#define rep(i,x,y) for(int i=x;i<=y;i++)
#define rep1(i,x,y) for(int i=x;i>=y;i--)
#define fire signed
#define kong putchar(' ')
#define end putchar('\n')
#define in(x) scanf("%lld",&x)
#define lcm(x,y) x*y/__gcd(x,y)
#define w(x)  while(x--)
#define il inline
il void print(int x) {
	if(x>=10) print(x/10);
	putchar(x%10+'0');
}
int n,k;
struct node{
	int m,v;
	friend bool operator < (const node&a,const node&b) {
		if(a.m!=b.m) return a.m<b.m;
		else return a.v>b.v;
	}
}s[300100];
int c[300100];
fire main() {
	in(n),in(k);
	rep(i,1,n) {
		in(s[i].m);
		in(s[i].v);
	}
	rep(i,1,k) in(c[i]);
	sort(c+1,c+1+k);
	priority_queue<int>q;
	sort(s+1,s+1+n);
	int res=false;
	int j=1;
	rep(i,1,k) {
		for(;j<=n&&s[j].m<=c[i];j++) q.push(s[j].v);
		if(q.size()) {
			res+=q.top();
			q.pop();
		}
	}
	cout<<res<<endl;
	return false;
}

posted @ 2024-01-31 11:44  highkj  阅读(4)  评论(0)    收藏  举报