[usaco]Mixing Milk题解

本文介绍了一个经典的贪心算法案例——购买牛奶问题。通过分析样例输入和输出,详细解释了如何通过排序和逐个选取最低价格的牛奶来实现最小化成本的目标。

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

题目:

输入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 farmers
5 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 costNotes
520205*20100
9400  Bought no milk from farmer 2
310103*1030
880408*40320Did not buy all 80 units!
630306*30180
Total180100 630Cheapest 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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值