混合牛奶
题目链接https://www.luogu.com.cn/problem/P1208
题意
在得知所需要的牛奶量、农民的个数与每个农民生产的牛奶量与其单价后,找到能够使Marry获得所需牛奶花费最少的最佳方案,输出最佳方案花费的金额。
思路
1.将单价从小到大排序
2.利用for循环累加每个农民产出的量与对应所需要的价钱
当累加的值小于n(所需要的牛奶量)时,此时的价格就等于该农民的产量(ai)*单价pi,再进行累加;当累加的值大于或等于n(所需要的牛奶量)时,此时的价格就等于(n-当前已有的牛奶量)*单价(pi)再加上之前累加的价格。
坑点
无
实现步骤
- 利用结构体存放每个农民的单价与产量
- 按照单价进行排序
- 定义每次的牛奶量与所需价格分别进行赋值
这里使用sum记录牛奶量,ans记录所需费用
根据排序后的单价,利用for从小到大进行产量的累加:
在第一个农民那里,能够获得10的牛奶量,此时sum=10,ans=30,10<n;第二个农民能够获得20的牛奶量,此时sum=30,ans=130,30<n;第三个农民那可获得30的牛奶量,此时sum=60,ans=310,60<n,再到第四个农民,第四个农民能够产出80的牛奶量,但此时我们距离题目所给的n(100),只差40(n-当前的sum)的牛奶量,此时的ans=(n-当前的sum(60))*80(该农民牛奶的单价)+310(前面累加的ans)(到达所需的量break即可)
代码
#include <bits/stdc++.h>
using namespace std;
struct name{
int p,c;
};
name num[5010];
bool cmp(name x,name y)
{
return x.p<y.p;
}
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<m;i++)
{
cin>>num[i].p>>num[i].c;
}
sort(num+0,num+m,cmp);
int sum=0;
int ans=0; //sum记录牛奶量,ans记录牛奶的费用
for (int i=0;i<m;i++)
{
if(sum+num[i].c<n)
{
sum+=num[i].c;
ans+=num[i].c*num[i].p;
}
else
{
ans+=(n-sum)*num[i].p;
break;
}
}
cout<<ans;
return 0;
}