A27689. 牛奶采购(milk)
填空题
中等
知识点
题目描述
牛奶采购(milk)
题目描述
由于乳制品产业利润很低,所以降低原材料(牛奶)价格就变得十分重要。请帮助爱丽丝乳业找到最优的牛奶采购方案。
爱丽丝乳业从一些奶农手中采购牛奶,并且每一位奶农为乳制品加工企业提供的价格可能相同。此外,就像每头奶牛每天只能挤出固定数量的奶一样,每位奶农每天能提供的牛奶数量是一定的。每天爱丽丝乳业可以从奶农手中采购到小于或者等于奶农最大产量的整数数量的牛奶。
给出爱丽丝乳业每天对牛奶的需求量,还有每位奶农提供的牛奶单价和产量。计算采购足够数量的牛奶所需的最小花费。
注:每天所有奶农的总产量大于爱丽丝乳业的需求量。
输入格式
第一行二个整数,m。n表示需要牛奶的总量,m表示提供牛奶的农民个数。
接下来行,每行两个整数表示第个农民牛奶的单价,和农民一天最多能供应的牛奶量。
输出格式
输出一行包含单独的一个整数,表示爱丽丝的牛奶制造公司拿到所需的牛奶所要的最小费用。
Samples
输入数据 1
100 5
5 20
9 40
3 10
8 80
6 30
输出数据 1
630
样例1解释
需要牛奶的总量为100,提供牛奶的农民个数为5,下列5行为各个农民提供牛奶的单价和总量,在众多采购方案中,花费最少为630。
数据范围

对于100% 的数据
参考答案
#include <iostream>
#include <algorithm> // 排序函数的头文件
using namespace std;
long long n, m, ans; // n为总需求量,m为奶农个数,ans为总价
struct node {// 定义结构体,用于存储奶农的牛奶单价和每天能提供的牛奶数量
int a, b; // a为单价,b为每个奶农每天能提供的牛奶数量
} a[5005]; // 定义结构体数组,存储所有奶农的信息
bool cmp(node a, node b) {// 定义一个比较函数,用于排序
if (a.a != b.a) // 如果单价不同,则按单价从低到高排序
return a.a < b.a;
else // 如果单价相同,则按每天能提供的牛奶数量从多到少排序
return a.b > b.b;
}
int main() {
cin >> n >> m; //总需求量和奶农个数
for (int i = 1; i <= m; i++) // 循环读取每个奶农的牛奶单价和每天能提供的牛奶数量
cin >> a[i].a >> a[i].b;
sort(a + 1, a + 1 + m, cmp); // 使用自定义的比较函数对奶农进行排序
int i = 1; // 定义变量i,用于遍历奶农
while (n) { // 当总需求量还未满足时继续循环
if (a[i].b != 0) { // 如果当前奶农还有牛奶可以卖
a[i].b--; // 购买一单位牛奶,所以当前奶农的牛奶数量减一
ans += a[i].a; // 购买牛奶的总花费等于之前的价格加上当前奶农的牛奶单价
n--; // 总需求量减一
} else // 如果当前奶农已经没有牛奶了
i++; // 跳到下一个奶农
}
cout << ans; // 输出总花费
return 0;
}
上一题
下一题