pat B1020月饼

思路:贪心

#include <iostream>
#include <algorithm>
#include <queue>
#include <iomanip>
using namespace std;

const int N = 1010;
double arrayK[N];
double arrayP[N];

struct cmp {
    template <typename T>
    bool operator() (const T& a, const T& b) {
        if (a.second < b.second)    return true;         //不清楚排序,这个是从大到小
        return false;
    }
};

int main() {
    int n;     //n是月饼种类,cap是容量
    double sum = 0, cap;
    priority_queue<pair<double, double>, vector<pair<double,double>>, cmp> pq;  //不清楚priority_queue如何默认比较大小
    
    cin >> n >> cap;
    
    int m = n;
    int k = 0;
    while (m --) { //输入总库存
        double kc;
        cin >> kc;
        arrayK[k ++] = kc;
    }
    m = n;
    k = 0;
    while (m --) {  //输入总售价
        double price;
        cin >> price;
        arrayP[k ++] = price;
    }
    for (int i = 0; i < n; i ++) {
        pq.emplace(arrayK[i], arrayP[i] / arrayK[i]);
    }
    
    
    while (cap > 0 && !pq.empty()) {        //没有判断pq是否为空***
        pair<double, double> moon = pq.top();   pq.pop();//pq忘了pop
        if (cap - moon.first >= 0) {
            sum += moon.first * moon.second;
        }
        else {
            sum += cap * moon.second;
        }
        cap -= moon.first;
        
    }
    cout << fixed << setprecision(2) << sum << endl;
    return 0;
}

错误点:

  1. cmp排序小于大于分不清
  2. 忘了判断优先队列为空的情况
  3. 每次取队顶时忘了pop
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值