混合牛奶 | 贪心算法 (USACO练习题)

一、混合牛奶 (USACO练习题)

【问题描述】

牛奶包装是一个如此低利润的生意,以至于尽可能低地控制初级产品(牛奶)的价格变得十分重要。请帮助Merry的牛奶制造公司(Merry Milk Makers')以尽可能最廉价的方式取得他们所需的牛奶。Merry的牛奶制造公司从一些农民那购买牛奶,每个农民卖给牛奶制造公司的价格不一定相同。而且,如一只母牛一天只能生产一定量的牛奶,农民每一天只有一定量的牛奶可以卖。每天,Merry的牛奶制造公司从每个农民那购买一定量的牛奶,少于或等于农民所能提供的最大值。现给出Merry牛奶制造公司的每日的牛奶需求,连同每个农民的可提供的牛奶量和每加仑的价格,请计算Merry的牛奶制造公司所要付出钱的最小值。

注意:每天农民生产的牛奶的总数对Merry的牛奶制造公司来说是足够的。

【输入格式】

第 1 行:二个整数, N 和 M。

第一个数值N(0<= N<=2,000,000)是Marry的牛奶制造公司的一天需要牛奶的数量。

第二个数值,M,(0<= M<=5,000)是提供牛奶的农民个数。

第 2 到 M+1 行:每行二个整数,Pi 和 Ai。Pi(0<= Pi<=1,000) 是农民 i 的牛奶的价格;Ai(0 <= Ai <= 2,000,000)是农民i一天能卖给Marry的牛奶制造公司的牛奶数量。

【输出格式】

单独的一行包含单独的一个整数,表示Marry的牛奶制造公司拿到所需的牛奶所要的最小费用。

【样例输入】       【样例输出】

100 5               630

5 20

9 40

3 10

8 80

6 30

【分析】这是一道大水题 >_<

若要付钱最少,那找卖的最便宜的就好啦~对农民的出售价格进行排序,就没然后了.

【代码】

ExpandedBlockStart.gif
 1 #include <algorithm>
 2 #include <cstdio>
 3 #include <vector>
 4  
 5 struct Node {
 6        int money, can_give;
 7        Node(int x, int y) : money(x), can_give(y) {}
 8 };
 9  
10 std::vector<Node> nodes;
11  
12 bool cmp(const Node& a, const Node& b) {
13        return a.money < b.money;
14 }
15 int main() {
16        int n, m, min_use = 0//n: needs; m: the number of farmers
17        scanf("%d %d", &n, &m);
18        for(int i = 0, x, y; i < m; i++) {
19               scanf("%d %d", &x, &y);
20               nodes.push_back(Node(x, y));
21        }
22        sort(nodes.begin(), nodes.end(), cmp);
23        for(int i = 0, tmp; i < m; i++) {
24               tmp = n - nodes[i].can_give;
25               if(tmp >= 0) {
26                      n = tmp;
27                      min_use += nodes[i].money * nodes[i].can_give;
28                      if(tmp == 0) {
29                             break;
30                      }
31               }else {
32                      min_use += (nodes[i].can_give - n) * nodes[i].money;
33                      break;
34               }
35        }
36        printf("%d\n", min_use);
37        return 0;
38 }
混合牛奶

转载于:https://www.cnblogs.com/uedge/p/5422712.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值