您的位置:首页 > 其它

USACO——混合牛奶

2017-02-12 08:46 281 查看
洛谷 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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: