吸氧80分求调
查看原帖
吸氧80分求调
626639
Neuronal_cells楼主2022/10/6 12:38
#include <stdio.h>
#include <iostream>
#include <cmath>
#include <algorithm>
#define ll long long 
using namespace std;
ll n,m,r,ans=0;
ll c[100005],buy[100005],flag[100005],cnt[100005];
struct node{
	ll v;
	ll value;
}cow[100005];
bool cmp1(node a,node b){
	return a.value>b.value;
}
bool cmp2(ll a,ll b){
	return a>b;
}
int main(){
	scanf("%lld%lld%lld", &n,&m,&r);
	for(ll i=1;i<=n;i++){
		scanf("%lld", &c[i]);
	}
	for(ll i=1;i<=m;i++){
		ll x,y;
		scanf("%lld %lld", &cow[i].v,&cow[i].value);
	}
	for(ll i=1;i<=r;i++){
		scanf("%lld", &buy[i]);
	}
	sort(cow+1,cow+1+m,cmp1);
	sort(buy+1,buy+1+r,cmp2);
	sort(c+1,c+n+1,cmp2);
	cnt[1]=cow[1].v*cow[1].value;
	for(int i=2;i<=m;i++){
		cnt[i]=cnt[i-1]+cow[i].v*cow[i].value;
		cow[i].v+=cow[i-1].v;
	}
	for(int i=2;i<=n;i++){
		c[i]+=c[i-1];
	}
	for(int i=2;i<=r;i++){
		buy[i]+=buy[i-1];
	}
	for(ll i=1;i<=n;i++){
		ll sum=0,vsum=c[i];
		for(ll j=1;j<=m;j++){
			if(vsum<=cow[j].v){
				sum+=cnt[j]-(cow[j].v-vsum)*cow[j].value;
				vsum=0;
				break;
			}
		}
		if(vsum){
			break;
		}
		sum+=buy[min(n-i,r)];
		ans=max(sum,ans);
	}
	printf("%lld", ans);
	return 0;
}
2022/10/6 12:38
加载中...