1 条题解

  • 2
    @ 2024-11-26 14:04:23

    不妨假设没有折扣价,直接将折扣作为优惠券加入,满a[i]元省a[i]-b[i]元,然后直接贪心。从小到大排序原价,用小根堆维护优惠券,贪心的使用w小的优惠券即可

    证明:证明略

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    int n,m,t=1,ans;
    int a[1000005],b[1000005];
    priority_queue<int> p;
    struct node{
    	int w;
    	int v;
    	bool operator<(const node &t)const{
    		return w<t.w;
    	}
    }e[2000006];
    
    signed main(){
    	freopen("buy.in","r",stdin);
    	freopen("buy.out","w",stdout);
    	scanf("%lld%lld",&n,&m);
    	for(int i=1;i<=n;i++) scanf("%lld%lld",&a[i],&b[i]);
    	for(int i=1;i<=m;i++) scanf("%lld%lld",&e[i].w,&e[i].v);
    	for(int i=1;i<=n;i++) e[i+m].w=a[i],e[i+m].v=a[i]-b[i];
    	sort(a+1,a+n+1);
    	m=m+n;
    	sort(e+1,e+m+1);
    	for(int i=1;i<=n;i++){
    		while(t<=m&&e[t].w<=a[i]) p.push(e[t].v),t++;
    		ans+=a[i];
    		if(!p.empty()){
    			ans-=p.top();
    			p.pop();
    		}
    	}
    	printf("%lld",ans);
    	return 0;
    }
    
    • 1

    信息

    ID
    2189
    时间
    5000ms
    内存
    512MiB
    难度
    9
    标签
    递交数
    14
    已通过
    3
    上传者