月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。
注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有3种月饼,其库存量分别为18、15、10万吨,总售价分别为75、72、45亿元。如果市场的最大需求量只有20万吨,那么我们最大收益策略应该是卖出全部15万吨第2种月饼、以及5万吨第3种月饼,获得 72 + 45/2 = 94.5(亿元)。
输入格式:
每个输入包含1个测试用例。每个测试用例先给出一个不超过1000的正整数N表示月饼的种类数、以及不超过500(以万吨为单位)的正整数D表示市场最大需求量。随后一行给出N个正数表示每种月饼的库存量(以万吨为单位);最后一行给出N个正数表示每种月饼的总售价(以亿元为单位)。数字间以空格分隔。
输出格式:
对每组测试用例,在一行中输出最大收益,以亿元为单位并精确到小数点后2位。
输入样例:3 20 18 15 10 75 72 45输出样例:
94.50
这个题目是值得一做的,主要使用了声明vector定义可变数组,并以此使用qsort排序,其次注意边际条件,即全部卖出依然不满足需求是停止结算。最后注意变量没有
说明是整数,要使用浮点型。
qsort函数原型:
- 1
qsort作为C语言标准库函数,可对连续地址存储的变量进行排序,没有默认排序方式,必须传入比较函数,并且相对于sort的操作符重载的方式改变排序规则的策略来讲,qsort只能通过改变比较函数的方式进行排序,策略单一。
参数值:排序的起始地址,排序的元素长度,要排序元素在内存中的占位值(即sizeof),比较函数指针
比较函数的原型为:
- 1
compare 函数的返回值 | 描述 |
---|---|
“< 0” | elem1将被排在elem2前面 |
“0” | elem1 等于 elem2 |
“> 0” | elem1 将被排在elem2后面 |
**这里需要注意的是,不同于qsort的比较函数,fcmp返回的是一个int值类型,而不是单纯的true和false
如果比较函数写成**
代码:#include <iostream>
#include <iomanip>
#include <vector>
using namespace std;
typedef struct{
double kucun;
double zongjia;
double danjian;
}yuebing;
int cmp(const void *a, const void *b)
{
return (*(yuebing *)b).danjian > (*(yuebing *)a).danjian ? 1 : -1;
}
int main()
{
int i,N, D;
bool flag=true;
double cost=0,sum_k=0;
cin >> N >> D;
vector<yuebing> x(N);
for (i = 0; i < N; i++)
{
cin >> x[i].kucun;
}
for (i = 0; i < N; i++)
{
cin >> x[i].zongjia;
}
for (i = 0; i < N; i++)
{
x[i].danjian = (double)x[i].zongjia / x[i].kucun;
}
qsort(&x[0], N, sizeof(x[0]), cmp);
for (i = 0; i < N; i++)
{
if ((sum_k + x[i].kucun )> D)
{
flag = false;
cost = cost + (D - sum_k)*x[i].zongjia / x[i].kucun;
cout << setiosflags(ios::fixed);
cout << setprecision(2) << cost << endl;
break;
}
else
{
sum_k += x[i].kucun;
cost += x[i].zongjia;
}
}
if (flag)
{
cout << setiosflags(ios::fixed);
cout << setprecision(2) << cost << endl;
}
return 0;
}