1 条题解

  • 0
    @ 2025-5-12 22:54:34

    问题理解

    我们需要从 NN 头小牛中选出尽可能多的小牛组成一支队伍,每头小牛有一个高度和一个重量。选出的队伍必须满足以下不等式:

    A×(Hh)+B×(Ww)CA \times (H - h) + B \times (W - w) \leq C 其中:

    • HHWW 是队伍中每头小牛的高度和重量。
    • hhww 是队伍中所有小牛的最小高度和最小重量。
    • AABBCC 是给定的正整数常量。

    解决思路

    1. 排序:首先,我们可以将小牛按照高度进行排序,这样可以方便地找到最小高度 hh
    2. 优先队列:使用优先队列(或堆)来维护当前可能的小牛集合,以便快速找到满足不等式的小牛。
    3. 遍历和检查:对于每头小牛,尝试将其作为当前的最小高度 hh,然后通过优先队列来维护满足不等式的小牛集合。
    4. 更新最大数量:在遍历过程中,不断更新满足条件的最大小牛数量。

    代码实现

    以下是基于上述思路的 C++ 代码实现:

    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <queue>
    
    using namespace std;
    
    struct Calf {
        int height;
        int weight;
        int s; // s = A * height + B * weight
    };
    
    bool compareHeight(const Calf &a, const Calf &b) {
        return a.height > b.height;
    }
    
    int main() {
        int N, A, B, C;
        cin >> N >> A >> B >> C;
    
        vector<Calf> calves(N);
        for (int i = 0; i < N; ++i) {
            cin >> calves[i].height >> calves[i].weight;
            calves[i].s = A * calves[i].height + B * calves[i].weight;
        }
    
        sort(calves.begin(), calves.end(), compareHeight);
    
        priority_queue<int> maxHeap;
        int maxCount = 0;
    
        for (int i = 0; i < N; ++i) {
            int currentHeight = calves[i].height;
            int currentWeight = calves[i].weight;
    
            while (!maxHeap.empty()) maxHeap.pop();
    
            for (int j = 0; j < N; ++j) {
                int h = min(currentHeight, calves[j].height);
                int w = min(currentWeight, calves[j].weight);
                if (A * (calves[j].height - h) + B * (calves[j].weight - w) <= C) {
                    maxHeap.push(calves[j].s);
                }
    
                while (!maxHeap.empty() && (A * (calves[j].height - h) + B * (calves[j].weight - w) > C)) {
                    maxHeap.pop();
                }
    
                maxCount = max(maxCount, (int)maxHeap.size());
            }
        }
    
        cout << maxCount << endl;
    
        return 0;
    }
    

    代码解释

    1. 输入处理:读取小牛的数量 NN 和常量 AABBCC
    2. 结构体定义:定义 Calf 结构体来存储每头小牛的高度、重量和计算值 ss
    3. 排序:根据高度对小牛进行排序,以便于后续处理。
    4. 优先队列:使用优先队列来维护当前可能的小牛集合。
    5. 遍历和检查:对于每头小牛,尝试将其作为最小高度,然后通过优先队列维护满足不等式的小牛集合。
    6. 更新最大数量:在遍历过程中,不断更新满足条件的最大小牛数量。

    通过这种方法,我们可以有效地找到满足条件的最大小牛数量。

    • 1

    信息

    ID
    1009
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者