[USACO18JAN] Rental Service S题解

题目描述

Farmer John 意识到牛奶生产的收入不足以支持农场的扩展,因此为了赚取额外收入,他推出了一项奶牛租赁服务,称为“USACOW”(发音为“Use-a-cow”)。

Farmer John 有 N 头奶牛(1≤N≤100,000),每头奶牛每天可以生产一定量的牛奶。附近的 M 家商店(1≤M≤100,000)每家都愿意以一定价格购买一定量的牛奶。此外,Farmer John 的 R 个邻居(1≤R≤100,000)每家都愿意以一定价格租赁一头奶牛。

Farmer John 需要决定每头奶牛是用于产奶还是租给附近的农民。请帮助他计算每天可以赚取的最大金额。

输入格式

输入的第一行包含 N、M 和 R。

接下来的 N 行每行包含一个整数 ci​(1≤ci​≤1,000,000),表示 Farmer John 的第 i 头奶牛每天可以生产 ci​ 加仑牛奶。

接下来的 M 行每行包含两个整数 qi​ 和 pi​(1≤qi​,pi​≤1,000,000),表示第 i 家商店愿意以每加仑 pi​ 美分的价格购买最多 qi​ 加仑牛奶。请注意,Farmer John 可以向每家商店出售任意数量的牛奶,范围从 0 到 qi​ 加仑。

接下来的 R 行每行包含一个整数 ri​(1≤ri​≤1,000,000),表示 Farmer John 的一个邻居愿意以每天 ri​ 美分的价格租赁一头奶牛。

输出格式

输出应包含一行,表示 Farmer John 通过产奶或租赁奶牛每天可以获得的最大利润。

请注意,输出可能超过标准 32 位整数的范围,因此可能需要使用更大的整数类型,例如 C/C++ 中的 long long

显示翻译

题意翻译

输入输出样例

输入 #1复制

5 3 4
6
2
4
7
1
10 25
2 10
15 15
250
80
100
40

输出 #1复制

725

说明/提示

Farmer John 应该让奶牛 #1 和 #4 产奶,每天生产 13 加仑牛奶。他应该完全满足 10 加仑的订单,赚取 250 美分,并以每加仑 15 美分的价格出售剩余的 3 加仑,总共赚取 295 美分的牛奶利润。

然后,他应该将其他三头奶牛分别以 250、80 和 100 美分的价格租出,赚取额外的 430 美分。(他应该忽略 40 美分的租赁请求。)这样,他每天的总利润为 725 美分。

思路

贪心。

代码见下

#include<bits/stdc++.h> 
using namespace std;
long long n,m,r,c[1000006],b[1000006],lc=1,lk=0,rf=0,fk=0,kl=0,ol=0;
struct one{
    long long q,p;
}a[1000006];
bool cmp(one a1,one b1){
    return a1.p>b1.p;
}
bool cmp2(long long a1,long long b1){
    return a1>b1;
}
int main(){
	cin>>n>>m>>r;
    for(int i=1;i<=n;i++){
        cin>>c[i];
    }
    for(int i=1;i<=m;i++){
        cin>>a[i].q>>a[i].p;
    }
    m++;
    a[m].q=1e18+7;
    a[m].p=0;
    rf=0;
    for(int i=1;i<=r;i++){
        cin>>b[i];
    }
    sort(c+1,c+n+1,cmp2);
    sort(b+1,b+r+1);
    sort(a+1,a+m+1,cmp);
    lc=0;
    lk=0;
    kl=0;
    ol=0;
    if(n<=r){
        for(int i=r;i>=r-n+1;i--){
            lk+=b[i];
        }
        fk=1;
        ol=r-n+1;
    }
    else{
        for(int i=r;i>=1;i--){
            lk+=b[i];
        }
        fk=n-r+1;  
        ol=1;
        for(int i=1;i<=n-r;i++){
            rf=c[i];
            while(rf!=0){
                if(a[lc+1].q<=rf){
                    rf-=a[lc+1].q;
                    lk+=(a[lc+1].q*a[lc+1].p);
                    lc++;
                }
                else{
                    a[lc+1].q-=rf;
                    lk+=(rf*a[lc+1].p);   
                    rf-=rf;    
                }
            }
        }
    }
    //cout<<lk<<endl;
    kl=lk;
    for(int i=fk;i<=n;i++){
        lk-=b[ol];
        rf=c[i];
        while(rf!=0){
            if(a[lc+1].q<=rf){
                rf-=a[lc+1].q;
                lk+=(a[lc+1].q*a[lc+1].p);
                lc++;
            }
            else{
                a[lc+1].q-=rf;
                lk+=(rf*a[lc+1].p);   
                rf-=rf;  
            }
        }
        ol++;
        kl=max(lk,kl);
    }
    cout<<kl<<endl;
	return 0;
}

posted @ 2025-10-15 21:47  bz02_2023f2  阅读(9)  评论(0)    收藏  举报  来源