第十三届山东省ICPC D题负重越野(贪心)

news2024/12/25 9:53:40

题目:

Problem D. 负重越野 您正在参加一场团体越野比赛。您的队伍共有 n 名队员,其中第 i 名队员的速度为 vi,体重为 wi。 比赛允许每名队员独立行动,也允许一名队员背着另一名队员一起行动。当队员 i 背着队员 j 时,如果 队员 i 的体重大于等于队员 j,则队员 i 的移动速度不会变化,仍然为 vi;如果队员 i 的体重小于队员 j,则队员 i 的移动速度会减去两者的体重差值,即变为 vi − (wj − wi)。如果队员 i 的移动速度将变为 负数,则队员 i 无法背起队员 j。每名队员最多只能背负另一名队员,被背负的队员无法同时背负其他 队员。 所有未被背负的队员中,最慢的队员的速度,即为整个队伍的速度。求整个队伍能达到的最大速度。 Input 有多组测试数据。第一行输入一个整数 T 表示测试数据组数,对于每组测试数据: 第一行输入一个整数 n(1 ≤ n ≤ 105)表示队员人数。 对于接下来 n 行,第 i 行输入两个整数 vi 和 wi(1 ≤ vi , wi ≤ 109)表示第 i 名队员的速度和体重。 保证所有数据中 n 之和不超过 105。 Output 每组数据输出一个整数,表示整个队伍可以达到的最大速度。

INPUT:

2 5 10 5 1 102 10 100 7 4 9 50 2 1 100 10 1

OUTPUT:

8 1 

Note 样例数据的最优策略如下: • 队员 1 背起队员 4。因为 w1 > w4,因此队员 1 速度不变,仍然为 10。 • 队员 3 背起队员 2。因为 w3 < w2,因此队员 3 的速度减少 w2 −w3 = 2,即速度变为 10−2 = 8。 • 队员 5 独立行动,速度为 9。 因此答案为 8。


分析:
 

这个问题可以看作是一个贪心算法的问题,即每次选择能使整个队伍速度最大的方案。具体的思路如下:

  • 首先,将所有队员按照速度从大到小排序,如果速度相同,则按照体重从小到大排序。这样可以保证在选择背负方案时,优先考虑速度快且体重轻的队员。
  • 然后,从前往后遍历排序后的队员,对于每个队员 i,检查是否有另一个队员 j 满足以下条件:
    • 队员 j 没有被背负过,也没有背负过其他队员。
    • 队员 i 的体重大于等于队员 j 的体重,或者队员 i 的速度减去两者的体重差值仍然大于等于队员 j 的速度。
    • 如果有多个满足条件的队员 j,则选择体重最大的那个。
  • 如果找到了这样的队员 j,则让队员 i 背负队员 j,并更新队员 i 的速度为 min(vi, vi - (wj - wi))。否则,让队员 i 独立行动。
  • 最后,遍历所有未被背负的队员,找出他们中速度最小的那个,即为整个队伍的速度。

//代码尚有错误,等待重改

Code:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct ss {
    int v; 
    int w;
    bool ced; // 是否被背负
    bool cing; // 是否背负其他人
};
// 定义一个比较函数,按照速度降序,体重升序排序
bool cmp(ss a, ss b) {
    if (a.v == b.v) {
        return a.w < b.w;
    }
    return a.v > b.v;
}

// 定义一个函数,求解整个队伍能达到的最大速度
int solve(vector<ss>& ple) {
    sort(ple.begin(), ple.end(), cmp);
    for (int i = 0; i < ple.size(); i++) {
        // 如果当前队员已经被背负过或者已经背负过其他人,则跳过
        if (ple[i].ced || ple[i].cing) {
            continue;
        }
        // 初始化最佳选择的下标和速度差值
        int best = -1;
        int diff = 0;
        // 遍历剩余的队员
        for (int j = i + 1; j < ple.size(); j++) {
            // 如果当前队员已经被背负过或者已经背负过其他人,则跳过
            if (ple[j].ced || ple[j].cing) {
                continue;
            }
            // 计算两者的体重差值和速度差值
            int wdiff = ple[j].w - ple[i].w;
            int sdiff = ple[i].v - ple[j].v;
            // 如果满足条件,则更新最佳选择和速度差值
            if (wdiff <= 0 || sdiff >= wdiff) {
                if (best == -1 || wdiff > diff) {
                    best = j;
                    diff = wdiff;
                }
            }
        }
        // 如果找到了最佳选择,则让队员 i 背负队员 j,并更新队员 i 的速度
        if (best != -1) 
        {
            ple[i].cing = true;
            ple[best].ced = true;
            ple[i].v = min(ple[i].v, ple[i].v - diff);
        }
    }

    // 初始化整个队伍的速度为最大值
    int team_v = INT_MAX;
    // 遍历所有未被背负的队员,找出速度最小的那个
    for (int i = 0; i < ple.size(); i++) {
        if (!ple[i].ced) {
            team_v = min(team_v, ple[i].v);
        }
    }
    // 返回整个队伍的速度
    return team_v;
}
int main() {
    int T;
    cin >> T;
    while (T--) {
        int n;
        cin >> n;
        vector<ss> ple(n);
        for (int i = 0; i < n; i++) {
            cin >> ple[i].v >> ple[i].w;
            ple[i].ced = false;
            ple[i].cing = false;
        }
        cout << solve(ple) << endl;
    }
    return 0;
}
/*2
5
10 5
1 102
10 100
7 4
9 50
2
1 100
10 1*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/611638.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java】一文搞懂生产者和消费者模型

阻塞队列的概念生产者消费者模式消息队列消息队列的作用 JDK中的阻塞队列实现阻塞队列实现生产者消费者模型 阻塞队列的概念 之前介绍过队列&#xff0c;是一种数据结构&#xff0c;先进先出FIFO。阻塞队列也满足队列的特性&#xff0c;不过有特殊之处&#xff1a; 入队元素时…

用好ChatGPT,还得加点“料”

前言 关于ChatGPT或者类似的产品&#xff0c;相信绝大数的小伙伴已经有自己资源进行使用了&#xff0c;虽然可以通过简单的对话方式能获取到相关的信息&#xff0c;但其实里面还是有一些讲究的&#xff0c;毕竟AI始终不是人类&#xff0c;要让它更好的理解我们组织的语言&…

使用Transformer模型进行计算机视觉任务的端对端对象检测

Transformer模型是google团队在2017在论文attention is all you need中提出的一个用于NLP领域的模型,但是随着VIT模型与Swin Transformer模型的发布,把Transformer模型成功应用到计算机视觉任务中。 上期图文,我们使用hugging face的transformers模型进行了VIT模型的对象分…

Nginx:Rewrite

Nginx&#xff1a;Rewrite 一、常用的Nginx 正则表达式二、location2.1 location 大致可以分为三类2.2 location 常用的匹配规则2.3 location 优先级2.4 实际网站使用中&#xff0c;至少有三个匹配规则定义 三、rewrite3.1 rewrite功能3.2 rewrite跳转实现3.3 rewrite 执行顺序…

【大作业之爬虫实战+数据分析与可视化处理上】——案例——如桃花来

目的任务&#xff1a; 目的任务 爬取租房网对应元素&#xff1a; 租房名 每月的价格 室内规格构造 房间大小 交通信息 保存数据到excel表格中 做数据清洗 数据可视化呈现 设计要求&#xff1a; 设计要求&#xff1a; 以类的方式书写&#xff0c;简洁明了。能够促进学生…

技术分享 | App常见bug解析

【摘要】 功能Bug内容显示错误前端页面展示的内容有误。这种错误的产生有两种可能1、前端代码写的文案错误2、接口返回值错误功能错误功能错误是在测试过程中最常见的类型之一&#xff0c;也就是产品的功能没有实现。比如图中的公众号登录不成功的问题。界面展示错乱产品界面上…

海睿思分享 | 摆脱数据质量低下困扰,这个方法简单有效!

2019年五月&#xff0c;某企业数据服务平台推送了运营花呗的蚂蚁小微小额贷款有限公司进入清算程序。 究其原因&#xff0c;该数据服务平台抓取了不真实且不完整的数据&#xff0c;导致生成的数据质量低&#xff0c;信息不真实、存在法律合规风险等情况。 由于支付宝和花呗的…

飞浆AI studio人工智能课程学习(4)-优质Prompt分享

文章目录 最具商业价值Prompt分享与颁奖02最具商业价值Prompt分享与颁奖-Top102最具商业价值Prompt分享与颁奖-Top202最具商业价值Prompt分享与颁奖-Top302最具商业价值Prompt分享与颁奖-Top402最具商业价值Prompt分享与颁奖-Top502最具商业价值Prompt分享与颁奖-Top602最具商业…

数字化艺术时代的新趋势:虚拟数字展厅的崛起

引言&#xff1a; 艺术与技术的融合正带领我们进入一个全新的数字化艺术时代。在这个时代中&#xff0c;虚拟数字展厅正在以惊人的速度崛起&#xff0c;并引领着展览的新趋势。 一&#xff0e;虚拟数字展厅的定义和特点 虚拟数字展厅是一种基于虚拟现实和全景技术的数字化艺术…

经典的设计模式——UML类图的一些规范

文章目录 一、类的表示二、接口的表示三、继承的表示四、接口实现的表示五、关联关系六、聚合关系七、合成关系八、依赖关系 一、类的表示 矩形框第一层表示名称&#xff0c;如果是抽象类&#xff0c;则用斜 体表示 第二层是属性 第三层是方法 号表示公有&#xff0c;-表示私有…

dll修复都有哪些方法?详细解析各种dll修复方法

DLL&#xff08;动态链接库&#xff09;是 Windows 操作系统中的一种重要文件&#xff0c;它包含了许多程序所需的函数和资源。因此&#xff0c;当 DLL 文件出现问题时&#xff0c;可能会导致程序无法正常运行&#xff0c;甚至整个系统崩溃。这时候需要使用 DLL 修复工具进行修…

Excel集成GPT,惊呆我了

Excel&GPT 从最开始的GPT对话&#xff0c;到后面的Office集成GPT进行内测&#xff0c;用GPT实现写Word、做Excel、做PPT&#xff08;别着急&#xff0c;后面我会分享AIPPT&#xff09;已经不再是设想&#xff0c;而在逐步演变成真的&#xff01; 当然&#xff0c;目前国内…

Vivado下时序逻辑模块的仿真

文章目录 D触发器两级D触发器带异步复位的D触发器带异步复位和同步置数的D触发器移位寄存器单口RAM伪双口RAM真双口RAM单口ROM 组合逻辑电路在逻辑功能上特点是任意时刻的输出仅仅取决于当前时刻的输入&#xff0c;与电路原来的状态无关。 时序逻辑在逻辑功能上的特点是任意时刻…

从0到1:如何建立一个大规模多语言代码生成预训练模型

国产AI辅助编程工具CodeGeeX是一个使用AI大模型为基座的辅助编程工具&#xff0c;帮助开发人员更快的编写代码。可以自动完成整个函数的编写&#xff0c;只需要根据注释或Tab按键即可。它已经在Java、JavaScript和Python等二十多种语言上进行了训练&#xff0c;并基于大量公开的…

【Python】打包与发布(Packaging and distributing projects)

以Unix/macOS系统为例。 前提准备&#xff1a;确保pip为最新版本&#xff0c;可使用以下命令来更新pip&#xff1a; python3 -m pip install --upgrade pip一、创建一个简单的项目 我们在目录packaging_tutorial下进行操作。 项目名称为&#xff1a;example_package_wayne。 …

【yolov5系列】yolov5目标检测的原理梳理+核心代码解析

打算写yolov5源码阅读和总结&#xff0c;已经打算了一年&#xff0c;如今已经更新到yolov8&#xff0c;只能说自己行动太慢了&#xff0c;哭泣(๑>؂<๑&#xff09;。趁着看要yolov8一起赶紧把yolov5总结总结。 一、Yolov5的网络结构 模型主要分为3部分 backbone&#x…

Maven 打包插件 maven-jar-plugin

文章目录 指定版本生成可执行 Jar准备依赖&#xff0c;并指定依赖位置自动下载依赖的 Jar 文件 打包时排除文件与其他常用打包插件比较 本文是对 maven-jar-plugin 常用配置的介绍&#xff0c;更详细的学习请参照 Apache Maven JAR Plugin 官方文档 这是 maven 生命周期 packa…

Python+Pytest+Allure+Git+Jenkins数据驱动接口自动化测试框架

一、接口基础   接口测试是对系统和组件之间的接口进行测试&#xff0c;主要是效验数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及相互逻辑依赖关系。其中接口协议分为HTTP&#xff0c;RPC&#xff0c;Webservice&#xff0c;Dubbo&#xff0c;RESTful等类型。 …

实用工具 | 语音文本对齐MFA的安装及使用

Montreal Forced Aligner&#xff08;MFA&#xff09;[1]是一个用于将音频和文本进行对齐的工具。它可以用于语音识别、语音合成和发音研究等领域。MFA支持多种语言和语音&#xff0c;用户可以根据需要自定义训练模型。 本博客介绍如何使用MFA对音频和文本进行对齐&#xff0c…

计算机网络实验:交换机划分Vlan配置

目录 前言实验目的实验内容实验过程总结 前言 计算机网络是当代信息技术的重要组成部分&#xff0c;也是现代社会的基础设施之一。为了提高计算机网络的性能和安全性&#xff0c;网络管理员需要对网络进行合理的规划和设计&#xff0c;包括对网络拓扑、地址分配、路由协议、交…