30pts求助
查看原帖
30pts求助
952033
lutaoquan2012楼主2024/7/15 22:24
//
// 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)的复杂度去算牛奶能给我多少钱肯定会超时,因为这个牛奶能赚的钱是递增的,所以不用每一次单独算,只用在上一次的基础上加上这次花的钱,如果是租的画,我用了一个前缀和

请求大佬帮我看一下

2024/7/15 22:24
加载中...