本文主要是介绍USACO——混合牛奶,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
洛谷 P1208 [USACO1.3]混合牛奶 Mixing Milk
题目描述
由于乳制品产业利润很低,所以降低原材料(牛奶)价格就变得十分重要。帮助Marry乳业找到最优的牛奶采购方案。
Marry乳业从一些奶农手中采购牛奶,并且每一位奶农为乳制品加工企业提供的价格是不同的。此外,就像每头奶牛每天只能挤出固定数量的奶,每位奶农每天能提供的牛奶数量是一定的。每天Marry乳业可以从奶农手中采购到小于或者等于奶农最大产量的整数数量的牛奶。
给出Marry乳业每天对牛奶的需求量,还有每位奶农提供的牛奶单价和产量。计算采购足够数量的牛奶所需的最小花费。
注:每天所有奶农的总产量大于Marry乳业的需求量。
分析
显而易见的经典“背包问题”(单价=重量,要求填满背包且重量最少)直接排序单价,从最小开始逐个收购即可
#include <iostream>
#include <cstdio>
using namespace std;
int sum,n,a[5001][3],i,m;
void qs(int l,int h)
{int i=l,j=h,mid=a[(l+h)/2][1],t;do{while (a[i][1]<mid) i++;while (a[j][1]>mid) j--;if (i<=j){t=a[i][1];a[i][1]=a[j][1];a[j][1]=t;t=a[i][2];a[i][2]=a[j][2];a[j][2]=t;i++;j--;}}while (i<=j);if (i<h) qs(i,h);if (j>l) qs(l,j);
}
int main()
{scanf("%d%d",&sum,&n);for (i=1;i<=n;i++)scanf("%d%d",&a[i][1],&a[i][2]);qs(1,n);i=0;m=0;while (sum!=0&i<=n){i++;if (sum-a[i][2]>=0){sum=sum-a[i][2];m=m+a[i][2]*a[i][1];}else{m=m+sum*a[i][1];sum=0;}}printf("%d",m);return(0);
}
这篇关于USACO——混合牛奶的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!