ber_ker 2024-05-05 12:09 采纳率: 44.4%
浏览 0

站外问题水题【782643873】

img

uu我饿风格月完工腐恶跳舞额发他王启发对呀特王启发对呀特发乌鸦退费武器研发他无非无法推特乌鸦范玮琪放弃要他与非

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-05 12:10
    关注

    引自免费微信小程序:皆我百晓生

    这个问题可以通过贪心算法解决。我们需要找到一个方法来分配每个子任务的测试点数量,使得满足所有子任务的最少测试点要求,并且总测试点数不超过m。同时,我们要最大化最小的qi / pi 比率。

    以下是详细的步骤:

    1. 对于每个子任务 (Pi, Wi),计算每个任务的优先级 qi / Pi = Wi / Pi。
    2. 将这些子任务按照优先级从高到低排序。
    3. 初始化一个空列表 qs 来存储每个子任务选择的测试点数。
    4. 从最高优先级开始遍历子任务,每次选择一个子任务并将其测试点数设置为Wi(因为Wi是最小需求)。
    5. 如果当前子任务的选择使得总测试点数超过了m,则减少最后一个被选中的子任务的测试点数,直到总测试点数小于等于m为止。
    6. 继续这个过程,直到所有的子任务都被处理。
    7. 计算最小的qi / pi比率,然后将结果转换为最简分数形式输出。

    下面是一个C++实现:

    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <cmath>
    
    struct Subtask {
        int Pi, Wi;
        double priority;
    
        bool operator<(const Subtask& other) const {
            return priority > other.priority;
        }
    };
    
    std::pair<int, int> gcd(int a, int b) {
        if (b == 0) {
            return {a, 1};
        } else {
            auto result = gcd(b, a % b);
            return {result.second, result.first};
        }
    }
    
    int main() {
        int n, m;
        std::cin >> n >> m;
    
        std::vector<Subtask> tasks(n);
        for (int i = 0; i < n; ++i) {
            std::cin >> tasks[i].Pi >> tasks[i].Wi;
            tasks[i].priority = static_cast<double>(tasks[i].Wi) / tasks[i].Pi;
        }
    
        std::sort(tasks.begin(), tasks.end());
    
        std::vector<int> qs(n, 0);
        int total_qi = 0;
    
        for (auto& task : tasks) {
            int qi = task.Wi;
            while (total_qi + qi > m) {
                --qs[qs.size() - 1];
                total_qi -= qi;
            }
            total_qi += qi;
            qs[tasks.size() - 1 - i] = qi;
        }
    
        if (total_qi < m) {
            std::cout << "Zip file size too big after extraction.Poor M!\n";
        } else {
            int min_ratio_numerator = INT_MAX;
            int min_ratio_denominator = INT_MAX;
    
            for (int qi : qs) {
                if (qi != 0 && qi < min_ratio_numerator * tasks[qs.size() - 1 - i].Pi) {
                    min_ratio_numerator = qi;
                    min_ratio_denominator = tasks[qs.size() - 1 - i].Pi;
                }
            }
    
            auto gcd_result = gcd(min_ratio_numerator, min_ratio_denominator);
            min_ratio_numerator /= gcd_result.first;
            min_ratio_denominator /= gcd_result.first;
    
            std::cout << min_ratio_numerator << "/" << min_ratio_denominator << "\n";
            for (int qi : qs) {
                std::cout << qi << " ";
            }
            std::cout << "\n";
        }
    
        return 0;
    }
    

    这段代码首先读取输入,然后创建一个结构体数组表示子任务及其优先级。接着进行排序,然后根据优先级分配测试点数。在分配过程中,如果超出限制,则回溯减少之前分配的测试点数。最后计算并输出最小的qi / pi比率以及对应的qi列表。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月5日

悬赏问题

  • ¥15 matlab数据降噪处理,提高数据的可信度,确保峰值信号的不损失?
  • ¥15 怎么看我在bios每次修改的日志
  • ¥15 python+mysql图书管理系统
  • ¥15 Questasim Error: (vcom-13)
  • ¥15 船舶旋回实验matlab
  • ¥30 SQL 数组,游标,递归覆盖原值
  • ¥15 为什么我的数据接收的那么慢呀有没有完整的 hal 库并 代码呀有的话能不能发我一份并且我用 printf 函数显示处理之后的数据,用 debug 就不能运行了呢
  • ¥20 gitlab 中文路径,无法下载
  • ¥15 用动态规划算法均分纸牌
  • ¥30 udp socket,bind 0.0.0.0 ,如何自动选取用户访问的服务器IP来回复数据