贪心 混合牛奶 Mixing Milk

题目描述

由于乳制品产业利润很低,所以降低原材料(牛奶)价格就变得十分重要。帮助 Marry 乳业找到最优的牛奶采购方案。

Marry 乳业从一些奶农手中采购牛奶,并且每一位奶农为乳制品加工企业提供的价格是不同的。此外,就像每头奶牛每天只能挤出固定数量的奶,每位奶农每天能提供的牛奶数量是一定的。每天 Marry 乳业可以从奶农手中采购到小于或者等于奶农最大产量的整数数量的牛奶。

给出 Marry 乳业每天对牛奶的需求量,还有每位奶农提供的牛奶单价和产量。计算采购足够数量的牛奶所需的最小花费。

注:每天所有奶农的总产量大于 Marry 乳业的需求量。

输入格式 

第一行二个整数 n,m表示需要牛奶的总量,和提供牛奶的农民个数。

接下来 m行,每行两个整数 pi,ai表示第 i 个农民牛奶的单价,和农民 i一天最多能卖出的牛奶量。

输出格式

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

输入输出样例

输入 

100 5 
5 20 
9 40 
3 10 
8 80 
6 30

输出 

630

说明/提示

【数据范围】

思路分析 

1,先按照单价排序,单价小的在前面; 单价一样的就把产量多的放前面;(这里用结构体做的,排序方便)

2.随后从单价最小的牛奶开始枚举,如果剩下要买的牛奶大于该牛奶数量,就买下所有这种牛奶。当无法买下所有这种牛奶的时候,就买所需要的。

3.最后即为计算所需购买牛奶费用。

这里是对元素排序后交换结构体所有元素

 对排好序的结构体成员进行输出测试

排序结果

计算所需奶农个数

innum[i].an-num[i].a
01001090
1902070
2703040
34080-40

通过上述代码我们可以知道为了购买牛奶我们寻找了几个奶农,方便后面计算购买牛奶的费用。 

计算费用 

 

完整代码如下 

#include<stdio.h>
struct ST
{
	int p;   //p 表示 牛奶的单价 
	int a;  //a 表示 一天最多能卖出的牛奶量 
}num[6000];
int main(void)
{
	int n,m;//n表示所需牛奶总量,m奶农个数 
	int i,j;
	struct ST t;//交换媒介 
	int sum = 0;//sum 为最小价格 
	scanf("%d %d",&n,&m);
	for(i = 0;i < m;i++)
	{
		scanf("%d %d",&num[i].p,&num[i].a);
	}
	
	for(i = 0;i < m-1;i++)//冒泡排序 对价格进行从小到大排序 
	{
		for(j=0;j < m-i-1;j++)
		{
			if( num[j].p > num[j+1].p )
			{
				t = num[j];
				num[j] = num[j+1];
				num[j+1] = t;//将结构体整体交换 
			}
		}
	} 
	for( i = 0 ; i < m ; i++  )//计算所需费用 
	{
		
		if(n - num[i].a <= 0)
		     break;
		n = n - num[i].a; 
	}
	for( j = 0 ; j < i ; j++  )
	{
		sum = num[j].a * num[j].p + sum;
		
	}
	sum = num[i].p * n + sum;
	
	printf("%d",sum);
	return 0;
}

总结

该题为典型的贪心算法,主要为排序贪心相结合。相似的练习可以选择洛谷p1223。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值