题目:
输入n和m表示需要n数量的牛奶,有m个商人提供。然后输入m组,每组两个数,分别代表单价和能提供的数量。
样例:
SAMPLE INPUT (file milk.in)
100 5 5 20 9 40 3 10 8 80 6 30
INPUT EXPLANATION
100 5 -- MMM wants 100 units of milk from 5 farmers5 20 -- Farmer 1 says, "I can sell you 20 units at 5 cents per unit"
9 40 etc.
3 10 -- Farmer 3 says, "I can sell you 10 units at 3 cents per unit"
8 80 etc.
6 30 -- Farmer 5 says, "I can sell you 30 units at 6 cents per unit"
OUTPUT FORMAT
A single line with a single integer that is the minimum cost that Merry Milk Makers must pay for one day's milk.
SAMPLE OUTPUT (file milk.out)
630
OUTPUT EXPLANATION
Here's how the MMM company spent only 630 cents to purchase 100 units of milk:Price per unit | Units available | Units bought | Price * # units | Total cost | Notes |
---|---|---|---|---|---|
5 | 20 | 20 | 5*20 | 100 | |
9 | 40 | 0 | Bought no milk from farmer 2 | ||
3 | 10 | 10 | 3*10 | 30 | |
8 | 80 | 40 | 8*40 | 320 | Did not buy all 80 units! |
6 | 30 | 30 | 6*30 | 180 | |
Total | 180 | 100 | 630 | Cheapest total cost |
题解:
他告诉我是贪心算法了(虽然没学过)。就是单价排个序,然后从最小的拿起,能拿光就拿光,拿满就好了,思路可以说是非常好想。单价排序我就用了sort,然后为了绑定单价和数量,我只能想到用一个结构体,因此就必须在sort函数的第三个参数中自定义一个Bool型的函数,从而使你能够使用结构体数组作为参数进行排序。期间学了一手sort的更多用法。
代码:
/*
ID: xcwhkh1
PROG: milk
LANG: C++
*/
#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
using namespace std;
struct milk{
int price,amt;
};
bool cp(milk m1,milk m2)
{
return m1.price<m2.price;
}
int main() {
ofstream fout ("milk.out");
ifstream fin ("milk.in");
int n,m,i,sum=0;//n是总数,m是人数
fin>>n>>m;
struct milk mk[5001];
for(i=0;i<m;i++)
fin>>mk[i].price>>mk[i].amt;
sort(mk,&mk[i],cp);
i=0;
while(mk[i].amt<n)
{
n-=mk[i].amt;
sum+=mk[i].amt*mk[i].price;
i++;
}
sum+=n*mk[i].price;
fout<<sum<<endl;
return 0;
}