1556. 月饼--贪心

目录

1556. 月饼

输入格式

输出格式

数据范围

输入样例:

输出样例:

代码:

运行结果:


1556. 月饼

月饼是中国的一种烘焙食品,是在中秋节期间食用的传统美食。

月饼的种类多种多样,不同的月饼可能会有不同的表皮和馅料。

现在,考虑到各种月饼的库存量和价格,以及市场对月饼的总需求量,请你计算出可以赚到的最大利润。

例如,共有 33 种月饼,存量分别为 180,150,100180,150,100(单位:千吨),总价值分别为 7.5,7.2,4.57.5,7.2,4.5 (单位:十亿元),市场总需求量为 200200,那么最佳销售方案是出售第二种月饼 150150,第三种月饼 5050,这样可获最大利润:7.2+4.5/2=9.457.2+4.5/2=9.45。

输入格式

第一行包含两个整数 NN 和 DD,分别表示月饼种类以及月饼总需求量。

第二行包含 NN 个正数,表示每种月饼的存量。

第三行包含 NN 个正数,表示每种月饼的总价值。

输出格式

输出一个数,表示最大利润,保留两位小数。

数据范围

1≤N≤10001≤N≤1000,
1≤D≤5001≤D≤500,
每种月饼的存量不超过 200200, 总价值不超过 20002000。

输入样例:
3 200
180 150 100
7.5 7.2 4.5
输出样例:
9.45
难度:简单
时/空限制:0.15s / 64MB
总通过数:724
总尝试数:1782
来源:

PAT甲级真题1070

算法标签

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;

struct mooncake{
    double store;//库存
    double sell;//总售价
    double prize;//单价
}cake[1001];

bool cmp(mooncake a,mooncake b){
    return a.prize>b.prize;
}

int main(){
    int n;  //种类
    double D;//需求量
    
    scanf("%d%lf",&n,&D);
    
    for(int i=0;i<n;i++){
        scanf("%lf",&cake[i].store);
    }
    for(int i=0;i<n;i++){
        scanf("%lf",&cake[i].sell);
        cake[i].prize=cake[i].sell/cake[i].store;
    }
    
    sort(cake,cake+n,cmp);  //单价从高到低
    
    double ans=0.0;//收益
    
    for(int i=0;i<n;i++){
        if(cake[i].store<=D){   //库存 > 需求量  
            D-=cake[i].store;    //第i种月饼全部卖出
            ans+=cake[i].sell;
        }else{  //库存 < 需求量  
            ans+=cake[i].prize*D;  //只卖出剩余需求量的月饼
            break;
        }
    }
    
    printf("%.2f\n", ans);
    
    return 0;
}

运行结果:

### 关于L2-003月饼问题的C++解决方案 L2-003月饼问题是经典的贪心算法题目之一,其核心在于通过最大化单位价值来解决问题。以下是基于此思路的一个可能的C++代码实现: #### 贪心策略描述 为了使销售总收入最大,在满足总需求量的前提下,应优先出售单位价格最高的月饼种类。因此可以按照每种月饼的价格与其库存的比例进行降序排列,并依次选取直到达到总需求量为止。 #### 实现细节 1. 输入数据结构化处理:读取输入并存储到合适的数据容器中。 2. 排序操作:依据单位售价对月饼种类排序。 3. 遍历计算收入:按顺序累加销售额直至满足需求或无更多可用资源。 下面是具体的C++程序示例: ```cpp #include <iostream> #include <vector> #include <algorithm> using namespace std; // 定义一个结构体用于保存每类月饼的信息 struct MoonCake { double price; // 总价 int stock; // 库存数量 }; bool compare(const MoonCake& a, const MoonCake& b){ return (a.price / a.stock) > (b.price / b.stock); // 单位价格比较函数 } int main(){ int n; double d; cin >> n >> d; // 输入n(种类数),d(市场需求总量) vector<MoonCake> cakes(n); for(int i=0;i<n;++i){ cin>>cakes[i].price; } for(int i=0;i<n;++i){ cin>>cakes[i].stock; } sort(cakes.begin(), cakes.end(), compare); double total_profit = 0.0; for(auto &cake : cakes){ if(d >= cake.stock){ // 如果剩余需求大于等于当前库存,则全部售出 total_profit += cake.price; d -= cake.stock; }else{ // 否则只卖出部分以刚好满足需求 total_profit += cake.price/cake.stock * d; break; } } printf("%.2f\n",total_profit); // 输出最终利润保留两位小数 return 0; } ``` 上述代码实现了基本功能[^1],其中包含了必要的输入解析、排序以及收益累积过程。注意这里假设所有输入均为合法数值形式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

captain_dong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值