总结一下 :(因为涉及到 小数计算 所以 类型 我选择了double)
第一次 提交 :测试点3 无论如何都过不去 。
最后 发现 忽略 两种情况 :
第一 : 所有 库存都满足 不了需求
比如 3 100
1 3 5
10 20 30
需求 100 而三种 月饼 加起来 才1+3+5=9 这种 情况是全要 结果输出 60.00
第二 :
最大月饼 收益 存在 不唯一情况 :
比如 3 100
1 2 3
10 20 30
这里的最大收益都 是一样的 ,所以 这种情况 判断时候也要考虑 ,不然 会出现重复 加 收益的情况 。
在循环遍历的时候 应该标记一下 ,已经取过的月饼 把库存清0;这样就不会 出现重复的问题
代码实现:
#include <stdio.h>
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <cctype>
#include <string>
#include <cstring>
#include <algorithm>
#include <ctime>
using namespace std;
double yuebing[1000]; // 月饼平均收益 数组
int main()
{
int m,n;
cin>>m>>n;
double a[1000],b[1000];
for (int i = 0; i < m; ++i)
{
cin>>a[i];
}
for (int i = 0; i < m; ++i)
{
cin>>b[i];
}
for (int i=0;i<m;i++) {
yuebing[i]=b[i]/a[i]; // 存起来 每种月饼的平均收益
}
sort(yuebing,yuebing+m); // 从小到大 排序
double sum=0;
for (int i=m-1;i>=0;i--) {
for (int j=0;j<m;j++) {
if (a[j]!=0 &&b[j]!=0 && b[j]/a[j]+0.0001==yuebing[i]+0.0001)
{
if (n>a[j]) // 如果需求 大于 库存 全部都要
{
sum+=b[j];
n=n-a[j]; // 剩余需求量
a[j]=0;
b[j]=0; // 计算过的 清库存 ;
if (i==0)
{ // 所有的月饼库存加起来都满足不了需求
printf("%.2lf",sum);
return 0;
}
break; // 找到符合条件的数之后 记得跳出不然过不了测试点3 。
}
else
{
sum+=b[j]*(n/a[j]); // 需求 小于 库存 按照比例来 然后 return
printf("%.2lf",sum);
return 0;
}
}
}
}
}
AC图 :