题目描述:
由于乳制品产业利润很低,所以降低原材料(牛奶)价格就变得十分重要。帮助 Marry 乳业找到最优的牛奶采购方案。
Marry 乳业从一些奶农手中采购牛奶,并且每一位奶农为乳制品加工企业提供的价格是不同的。此外,就像每头奶牛每天只能挤出固定数量的奶,每位奶农每天能提供的牛奶数量是一定的。每天 Marry 乳业可以从奶农手中采购到小于或者等于奶农最大产量的整数数量的牛奶。
给出 Marry 乳业每天对牛奶的需求量,还有每位奶农提供的牛奶单价和产量。计算采购足够数量的牛奶所需的最小花费。
注:每天所有奶农的总产量大于 Marry 乳业的需求量。
输入格式:
第一行共二个数值:N\ (0\le N\le 2,000,000)N (0≤N≤2,000,000)是需要牛奶的总数;M\ (0\le M\le 5,000)M (0≤M≤5,000)是提供牛奶的农民个数。
接下来 MM 行,每行二个整数:P_iPi 和 A_iAi。
P_i\ (0\le P_i\le 1,000)Pi (0≤Pi≤1,000) 是农民 ii 的牛奶的单价。
A_i(0 \le A_i \le 2,000,000)Ai(0≤Ai≤2,000,000)是农民 ii 一天能卖给 Marry 的牛奶制造公司的牛奶数量。
输出格式:
单独的一行包含单独的一个整数,表示 Marry 的牛奶制造公司拿到所需的牛奶所要的最小费用。
实例:
输入:
100 5 5 20 9 40 3 10 8 80 6 30
输出:
630
解题思路:
要想花最少的钱,所以应该先买完售价最低的牛奶,在二维数组里怎么找呢?通过从小到大的排序一个一个遍历,知道满足需求量停止。在这期间要判断需求量和这个价格牛奶的供应量谁大谁小,按小的那个计算花费。
所以编写代码顺序是:录入数据-->二维数组排序-->计算总额
参考代码:
void quickSort(int a[][2], int l, int r)//二维数组快排
{
int x = a[l][0], m = l-1, n = r+1;
if (l >= r)return;
while(m<n)
{
m++; while (a[m][0] < x) m++;//也可以用do-while实现
n--; while (a[n][0] > x) n--;
if(m < n)//二维数组交换值,每一行的数据是要在一起的
{
int t1, t2;
t1 = a[m][0]; t2 = a[m][1];
a[m][0] = a[n][0]; a[m][1] = a[n][1];
a[n][0] = t1; a[n][1] = t2;
}
}
quickSort(a, l, n);//递归
quickSort(a, n + 1, r);
}
#include<cstdio>
#include<iostream>
#define ll long long;
using namespace std;
int a[5001][2];//第一列为单价,第二列为牛奶产量
int main()
{
int Need, num;//需求量、农民数
scanf("%d%d", &Need, &num);
for(int i=0;i<num;i++)
{
for(int j=0;j<2;j++)
{
scanf("%d", &a[i][j]);//录入数据
}
}
quickSort(a, 0, num - 1);//二维数组快排
int sum = 0;//计算最后的最小花费
while(Need>0)//需求量还没有满足时
{
for (int i = 0; i < num; i++)
{
if(Need>=a[i][1])//需求量大于该农民提供的牛奶
{
Need -= a[i][1];
sum += a[i][0] * a[i][1];
}
else
{
sum += a[i][0] * Need;
Need = 0;
}
}
}
cout << sum;
return 0;
}