[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;
}

浙公网安备 33010602011771号