我太菜了,只会做后两题

题目大意

有一些物品,每个的数量是 ,价值是 ,每天每种物品能拿一个,求 能得到的最大价值

具体做法

考虑贪心。每天一定会把所有还有剩余的物品全拿一次,所以第 见物品取得次数是 。把 放到一个结构体里,按 排序,统计 的前缀和和 的后缀和,每次询问用二分找到一个点 使得 && 输出 即可

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,sum[100010],summ[100010];
struct node{
	int a,b;
}x[100010];
bool cmp(node a,node b){
	return a.b<b.b;
}
signed main(){
	scanf("%lld",&n);
	for(int i=1;i<=n;i++) scanf("%lld",&x[i].a);
	for(int i=1;i<=n;i++) scanf("%lld",&x[i].b);
	sort(x+1,x+1+n,cmp);
	for(int i=1;i<=n;i++) sum[i]=sum[i-1]+x[i].a*x[i].b;
	for(int i=n;i>=1;i--) summ[i]=summ[i+1]+x[i].a;
	int q;
	scanf("%lld",&q);
	while(q--){
		int k;
		scanf("%lld",&k);
		int l=0,r=n,ans=0;
		while(l<=r){
			int mid=(l+r)/2;
			if(x[mid].b>=k) r=mid-1;
			else ans=mid,l=mid+1;
		}
		printf("%lld\n",sum[ans]+summ[ans+1]*k);
	}
    return 0;
}