【题解】NC26221 chika和蜜柑(排序 / topK)

https://ac.nowcoder.com/acm/problem/26221
在这里插入图片描述
排序

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
typedef pair<int, int> PII; // <酸度, 甜度>


int main() {
    int n, k;
    cin >> n >> k;
    vector<PII> vp(n);
    for (int i = 0; i < n; ++i) cin >> vp[i].first;
    for (int i = 0; i < n; ++i) cin >> vp[i].second;
    
    sort(vp.begin(), vp.end(), [&](const PII a, const PII b) {
        if(a.second != b.second) return a.second > b.second;
        else return a.first < b.first;
    });
    
    long long s = 0, t = 0;
    for (int i = 0; i < k; ++i) {
        s += vp[i].first;
        t += vp[i].second;
    }
    
    cout << s << ' ' << t << endl;   
    return 0;
}

优先队列

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

struct Orange {
    int acidity;
    int sweetness;

    Orange(int a, int s) : acidity(a), sweetness(s) {}

    bool operator<(const Orange& o) const {
        if (sweetness == o.sweetness) {
            return acidity < o.acidity; // 甜度相同,酸度小的优先
        }
        return sweetness > o.sweetness; // 甜度大的优先
    }
};

int main() {
    int n, k;
    cin >> n >> k;
    vector<int> acidity(n), sweetness(n);
    for (int i = 0; i < n; ++i) {
        cin >> acidity[i];
    }
    for (int i = 0; i < n; ++i) {
        cin >> sweetness[i];
    }

    // 使用小根堆存储橘子,限制堆的大小为前k个
    priority_queue<Orange> pq;
    for (int i = 0; i < n; ++i) {
        pq.push(Orange(acidity[i], sweetness[i]));
        if (pq.size() > k) {
            pq.pop(); // 弹出堆顶元素,保持堆的大小为k
        }
    }

    long long totalAcidity = 0, totalSweetness = 0;
    // 计算总酸度和总甜度
    while (!pq.empty()) {
        totalAcidity += pq.top().acidity;
        totalSweetness += pq.top().sweetness;
        pq.pop();
    }

    cout << totalAcidity << " " << totalSweetness << endl;
    return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Q_hd

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

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

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

打赏作者

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

抵扣说明:

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

余额充值