牛奶厂向农民买牛奶,每天需要买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;
}