混合牛奶 | 贪心算法 (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

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

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

【代码】

 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 }

混合牛奶

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
USACO (美国计算机奥林匹克竞赛)是一个广受欢迎的竞技性计算机编程比赛,对于新手来说思维题是一个很好的起点。思维题旨在培养学生的创造力、逻辑思维和问题解决能力。 对于USACO的新手思维题来说,我认为有几个重要的方面需要考虑。首先是理解题目,要准确地理解题目的要求和限制条件,包括输入输出格式、数据范围等。这样可以避免在解题过程中产生偏差。 其次是分析问题,要尽可能地通过例子和测试样例来观察和揭示问题的规律和特点。通过发现并解决子问题,逐步推导出正确的解决方法。可以使用逻辑推理、数学推导等工具辅助分析问题。 第三点是编程实现,根据经验和理解,选择合适的编程语言和算法进行实现。在代码编写过程中,注重代码的可读性和简洁性,合理利用量和函数,避免重复代码和冗余操作。合理使用循环、条件判断等结构,确保程序的正确性和高效性。 最后是测试和调试,通过输入不同的测试样例来验证程序的正确性。特别是从边界条件和极端情况考虑,检查是否有错误或潜在的漏洞。当发现问题时,要运用调试工具和技巧来找出错误的原因,并对代码进行相应的修改和优化。 总之,USACO新手思维题是一个很好的锻炼编程思维和能力的机会。通过认真理解题目、分析问题、编写实现和测试调试,可以有效地解决这些思维题,提升自己的编程水平。随着不断的练习和积累,我相信每个新手都能够在USACO竞赛中进一步成长和取得更好的成绩。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枫叶思念

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值