//
// Created by 55062 on 2024/7/15.
//
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,r,c[100010],e[100010],sum[100010],ans,pos=1,summ,cnt;
struct node{
ll x,y;//z是单价
}w[100010];
bool cmp(node x,node y){
return x.y>y.y;
}ll pri(ll x){
summ+=c[x];
//cout<<summ<<" "<<pos<<" "<<cnt<<endl;
for(int i=pos;i<=m;i++){
if(summ>=w[i].x){
summ-=w[i].x;
cnt+=w[i].y*w[i].x;
pos++;
//cout<<summ<<" "<<pos<<" "<<cnt<<endl;
}else{
w[i].x-=summ;
cnt+=summ*w[i].y;
summ=0;
break;
}
}return cnt;
}bool cmp2(ll x,ll y){
return x>y;
}
int main() {
cin>>n>>m>>r;
for(int i=1;i<=n;i++) cin>>c[i];
for(int i=1;i<=m;i++) cin>>w[i].x>>w[i].y;
for(int i=1;i<=r;i++) cin>>e[i];
for(int i=1;i<=r;i++) sum[i]=sum[i-1]+e[i];
sort(c+1,c+n+1,cmp2);
sort(w+1,w+m+1,cmp);
sort(e+1,e+r+1,cmp2);
for(int i=1;i<=n+1;i++)//1 - i-1牛奶,i-n租
ans=max(ans,sum[min(n-i+1,r)]+pri(i-1));
cout<<ans;
return 0;
}
/*
7
6
4
2
1
2 10
10 25
15 15
250
100
80
40
*/
我用的方法是贪心,因为他的每头奶牛一定把生产量最低的分配个租借一整头奶牛的,生产量高的分配给那些租牛奶的,所以我对这些奶牛的生产数做了排序,画了个分界线,枚举这个分界线,我定义的是1 - i-1牛奶,i-n租。
因为如果每次O(m)的复杂度去算牛奶能给我多少钱肯定会超时,因为这个牛奶能赚的钱是递增的,所以不用每一次单独算,只用在上一次的基础上加上这次花的钱,如果是租的画,我用了一个前缀和
请求大佬帮我看一下