pat 乙级 1020 吃月饼(25)



总结一下 :(因为涉及到 小数计算 所以 类型 我选择了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图 :



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值