Problem 76 Mixing Milk

博客围绕牛奶厂采购牛奶问题展开,每天需采购N个单位牛奶,有M个农民供货且总量大于N。采用贪心算法,将农民按价格排序后采购,使用map数据结构自动排序,但要注意map无重复key,而农民价格可能重复。还指出贪心算法虽简单,但很多情况不能得最优解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

牛奶厂向农民买牛奶,每天需要买N个单位的牛奶,现有M个农民(奶民?),求最便宜的买法,假设农民提供的总量一定比N大。这个问题也是很标准的贪心问题,把农民按价格排序,买够为止。这里数据结构用的是map,因为map会自动排序,嘿嘿。不过小心map没有重复key,而农民的价格可能会重复。

注:贪心算法通常无论思路、代码都很简单,但贪心算法在很多情况下都是不正确的(或者说都不能得到最优解)。如果能证明贪心法是正确的话,那它一般都是最佳选择。

#include <iostream>
#include <fstream>
#include <map>
using namespace std;

int main(){
 int gallon, num;
 ifstream fin("milk.in");
 fin>>gallon>>num;
 
 map<int, int> farmer;
 for(int i = 0; i < num; ++i){
  int price, quantity;
  fin>>price>>quantity;
  if(farmer.find(price) == farmer.end())
   farmer[price] = quantity;
  else farmer[price] += quantity;
 }
 
 int cost = 0;
 map<int, int>::iterator mi = farmer.begin();
 for(; mi != farmer.end() && gallon > 0; ++mi){
  if(mi->second < gallon){
   cost += mi->first * mi->second;
   gallon -= mi->second;
  } else {
   cost += mi->first * gallon;
   gallon = 0;
  }
 }
 
 ofstream fout("milk.out");
 fout<<cost<<endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值