CSP-J 复赛算法 贪心算法

文章目录

  • 前言
  • 贪心算法
    • 贪心算法在生活中的例子
      • 贪心算法的基本思路:
      • 贪心算法适用问题:
      • 贪心算法适用问题示例:
      • 贪心算法流程图
  • 排队接水问题
    • 问题分析
      • 算法步骤
      • 贪心算法证明
      • 代码实现
      • 代码解释:
      • 测试用例
      • 结论
  • 总结


前言

在算法竞赛中,贪心算法因其简洁和高效的特点成为解决问题的重要工具之一。它通过在每个阶段选择当前最优解(局部最优解),期望最终能导向全局最优解。在实际应用中,贪心算法适用于某些特定问题,例如最小生成树、活动安排、背包问题等。在CSP-J复赛中,贪心算法也经常出现在需要快速做出最优选择的场景中。

贪心算法的核心思想在于每次做出局部最优选择而不考虑全局问题的细节。因此,贪心算法的正确性依赖于问题本身是否具备“贪心选择性质”和“最优子结构”这两个关键性质。如果一个问题符合这两个条件,贪心算法就能很好地解决该问题并保证全局最优解。

通过研究贪心算法,我们不仅可以提升解决特定类型问题的能力,还能加深对算法设计策略的理解,为后续的高级竞赛题型打下坚实的基础。在本文中,我们将介绍贪心算法在CSP-J复赛中的常见应用场景,并通过实际的例题讲解如何利用贪心策略快速、准确地解题。


贪心算法

贪心算法是一种在每一步选择中,始终做出当前最优解的策略,以期望通过一系列局部最优解达到全局最优结果。它不追溯或修正以前的决策,一旦做出选择,不能再改变,因此贪心算法只能用于某些特定的问题类型。

贪心算法在生活中的例子

  1. 找零问题:假设你需要找零,面额有1元、5元、10元等,贪心算法的做法是优先用最大面额的硬币,以最少数量的硬币完成找零。
  2. 时间管理:例如安排一天的任务时间,贪心策略是每次选择耗时最短的任务先做完,能快速完成更多的任务。
  3. 活动选择问题:在有限的时间内,如何选择尽可能多的活动,例如安排会议,每次总是选择最早结束的活动。

贪心算法的基本思路:

  1. 问题分解:将问题分解为一系列子问题。
  2. 局部最优选择:在每一步选择中,始终做出当前看似最优的决策。
  3. 不可回溯:一旦做出选择,不能回退或更改之前的决策。
  4. 合并解:通过一系列局部最优解合并成全局解。

贪心算法适用问题:

贪心算法不能保证所有问题的全局最优解,因此它适用于特定类型的问题,通常满足以下两个条件:

  1. 贪心选择性质:局部最优解能导向全局最优解,即做出的局部决策不会影响全局最优解。
  2. 最优子结构性质:问题的全局最优解能够通过其子问题的最优解组合而成。

贪心算法适用问题示例:

  1. 最小生成树问题:用贪心算法的Kruskal或Prim算法求图的最小生成树。
  2. 最短路径问题:Dijkstra算法就是一种基于贪心策略的最短路径算法。
  3. 背包问题(0-1 背包的贪心版本):每次选择性价比最高的物品放入背包,直到背包装满。

贪心算法流程图

graph TD;A(开始) --> B(分解问题);B --> C{是否可以直接做选择?};C -- 是 --> D(选择当前最优解);D --> E(更新问题);E --> C;C -- 否 --> F(合并局部解);F --> G(得出全局解);G --> H(结束);

适用问题

  • 贪心算法适用于那些可以通过一系列局部最优决策得到全局最优解的问题,比如活动选择问题、图中的最小生成树问题等。

这个问题是一个典型的 贪心算法 问题,目标是通过调整排队顺序,使得所有人的平均等待时间最小。我们可以通过分析每个人的接水时间来决定如何安排他们的顺序。

排队接水问题

问题分析

  1. 定义等待时间
    假设有 ( n ) 个人排队,第 ( i ) 个人接水需要的时间为 ( T_i )。
    当所有人按某种顺序排队时,每个人的等待时间是所有排在他前面的人接水时间之和。
    比如:

    • 第一个人不需要等待,等待时间为 0。
    • 第二个人需要等待第一个人接水的时间,等待时间为 ( T_1 )。
    • 第三个人需要等待前两个人接水的时间,等待时间为 ( T_1 + T_2 )。
    • 以此类推,第 ( i ) 个人的等待时间为前 ( i-1 ) 个人接水时间的总和。
  2. 优化思路
    我们的目标是让所有人的平均等待时间最小
    显然,接水时间越短的人应该越早排队,因为这样能减少后面的人等待的时间。
    贪心策略:按照接水时间 ( T_i ) 从小到大排序排队。

  3. 平均等待时间计算
    总等待时间是所有人的等待时间之和,平均等待时间是总等待时间除以人数 ( n )。

算法步骤

  1. 对每个人的接水时间排序,使得接水时间短的人排在前面。
  2. 计算每个人的等待时间,即每个人前面所有人的接水时间之和。
  3. 计算平均等待时间

贪心算法证明

根据贪心选择的性质,如果我们按照接水时间从小到大排序,就能在每一步都保证局部最优解,并最终获得全局最优解。这个问题满足贪心算法的两个条件:

  • 贪心选择性质:在每一步选择中,安排时间短的人先接水能够减少后续人等待的总时间。
  • 最优子结构:如果我们对前 ( i ) 个人的排队顺序是最优的,那么加入第 ( i+1 ) 个人时,仍然可以通过选择最短时间来保持最优解。

代码实现

下面是这个问题的 Python 实现:

#include <iostream>
#include <vector>
#include <algorithm> // 用于 sort 函数using namespace std;// 计算最小平均等待时间
double minAvgWaitTime(vector<int>& T) {int n = T.size();// 1. 将接水时间按从小到大排序sort(T.begin(), T.end());// 2. 计算总等待时间int totalWaitTime = 0;int currentWaitTime = 0;for (int i = 0; i < n; ++i) {totalWaitTime += currentWaitTime;currentWaitTime += T[i];}// 3. 计算平均等待时间double avgWaitTime = static_cast<double>(totalWaitTime) / n;return avgWaitTime;
}int main() {// 测试用例:接水时间vector<int> T = {3, 1, 4, 3, 2};// 计算最小平均等待时间double avgTime = minAvgWaitTime(T);// 输出结果cout << "最小平均等待时间为: " << avgTime << endl;return 0;
}

代码解释:

  1. 输入
    T 是一个列表,存储了每个人的接水时间。

  2. 排序
    首先将接水时间从小到大排序,这样可以使得等待时间最短。

  3. 计算等待时间
    使用两个变量 total_wait_timecurrent_wait_timecurrent_wait_time 记录当前人接水之前的所有等待时间,并累加到 total_wait_time

  4. 输出
    返回所有人的平均等待时间。

测试用例

对于 T = [3, 1, 4, 3, 2]

  • 排序后接水时间为:[1, 2, 3, 3, 4]
  • 每个人的等待时间:
    • 第一个人等待 0 分钟
    • 第二个人等待 1 分钟
    • 第三个人等待 1 + 2 = 3 分钟
    • 第四个人等待 1 + 2 + 3 = 6 分钟
    • 第五个人等待 1 + 2 + 3 + 3 = 9 分钟
  • 总等待时间为:0 + 1 + 3 + 6 + 9 = 19
  • 平均等待时间为:19 / 5 = 3.8

因此,输出的最小平均等待时间为 3.8

结论

通过贪心算法,我们可以有效地减少所有人的等待时间。关键是按接水时间排序,使得等待时间最短的人先排队,这样可以减少后面的人等待的总时间。


总结

贪心算法在CSP-J复赛中是应对特定问题的有力工具。其简单易懂的思想使得它在时间紧迫的竞赛环境中尤为有效。通过每一步选择局部最优解,我们可以快速解决具有贪心性质的问题。然而,贪心算法并非万能,它无法保证适用于所有问题。因此,在使用贪心策略之前,我们需要仔细分析问题是否具备贪心选择性质和最优子结构。

CSP-J复赛中的贪心算法题型往往考验选手的思维敏捷性和对问题特性的准确判断。掌握贪心算法的基本原理并结合大量训练,不仅能帮助我们高效解题,还能在面对复杂的竞赛题目时提供强大的思路支持。对于参赛选手来说,学会在比赛中灵活运用贪心策略,将大大提高解决问题的效率和竞赛成绩。

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

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

相关文章

【floor报错注入】

一、sql语句基础 floor 向下取整 count 取数据的数量 group by 分组查询 Rand 随机数 limit 二、floor报错注入 主键重复报错 我们先了解group by产生的虚拟表的原理&#xff0c;了解到虚拟表的主键是不可以重复的 我们再可以通过Rand(0)函数规定固定种子后乘2&…

Win10之Ubuntu22.04(主机)与Virtual-BOX(宿主win10)网络互通调试(七十九)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

An End-to-End Local Attention Based Model for Table Recognition(ICDAR 2023)

An End-to-End Local Attention Based Model for Table Recognition(ICDAR 2023) 一.前述 作者认为基于Transformer的表格识别模型很难处理大表格的识别&#xff0c;原因是受限于它的全局注意力global attention机制。 基于以上&#xff0c;作者提出了一种局部注意力local a…

.NET Core 高性能并发编程

一、高性能大并发架构设计 .NET Core 是一个高性能、可扩展的开发框架&#xff0c;可以用于构建各种类型的应用程序&#xff0c;包括高性能大并发应用程序。为了设计和开发高性能大并发 .NET Core 应用程序&#xff0c;需要考虑以下几个方面&#xff1a; 1. 异步编程 异步编程…

在线css像素Px到百分比(%)换算器

具体请前往&#xff1a;在线Px转百分比(%)工具--将绝对像素(px)长度单位转换为相对父级元素内尺寸的相对长度单位百分比(%)

PCL 点云模型滤波(圆形)

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 生成点云数据 2.1.2 模型滤波函数 2.1.3 可视化函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xf…

树和二叉树知识点大全及相关题目练习【数据结构】

树和二叉树 要注意树和二叉树是两个完全不同的结构、概念&#xff0c;它们之间不存在包含之类的关系 树的定义 树&#xff08;Tree&#xff09;是n&#xff08;n≥0&#xff09;个结点的有限集&#xff0c;它或为空树&#xff08;n 0&#xff09;&#xff1b;或为非空树&a…

lambda表达式底层实现:反编译LambdaMetafactory + 转储dump + 运行过程 + 反汇编 + 动态指令invokedynamic

一、结论先行 lambda 底层实现机制 1.lambda 表达式的本质&#xff1a;函数式接口的匿名子类的匿名对象 2.lambda表达式是语法糖 语法糖&#xff1a;编码时是lambda简洁的表达式&#xff0c;在字节码期&#xff0c;语法糖会被转换为实际复杂的实现方式&#xff0c;含义不变&am…

基于springboot的数据库原理教学案例案例库管理系统

目录 毕设制作流程功能和技术介绍系统实现截图开发核心技术介绍&#xff1a;使用说明开发步骤编译运行代码执行流程核心代码部分展示可行性分析软件测试详细视频演示源码获取 毕设制作流程 &#xff08;1&#xff09;与指导老师确定系统主要功能&#xff1b; &#xff08;2&am…

PMP--三模--解题--71-80

文章目录 7.成本管理--S曲线--S曲线对累计值进行监督和报告--S曲线可以同时报告成本与进度情况。适用于预测和敏捷项目。14.敏捷--信息发射源--是一种可见的实物展示其向组织内其他成员提供信息在不干扰团队的情况下即时实现知识共享。71、 [单选] 项目经理正在为刚刚进入第三次…

windows配置C++编译环境和VScode C++配置(保姆级教程)

1.安装MinGW-w64 MinGW-w64是一个开源的编译器套件,适用于Windows平台,支持32位和64位应用程序的开发。它包含了GCC编译器、GDB调试器以及其他必要的工具,是C++开发者在Windows环境下进行开发的重要工具。 我找到了一个下载比较快的链接:https://gitcode.com/open-source-…

FastAPI 第九课 -- 表单数据

目录 一. 前言 二. 声明表单数据模型 三. 在路由中接收表单数据 四. 表单数据的验证和文档生成 五. 处理文件上传 一. 前言 在 FastAPI 中&#xff0c;接收表单数据是一种常见的操作&#xff0c;通常用于处理用户通过 HTML 表单提交的数据。 FastAPI 提供了 Form 类型&a…

C++发邮件:如何轻松实现邮件自动化发送?

C发邮件的详细步骤与教程指南&#xff1f;如何在C中发邮件&#xff1f; 无论是定期发送报告、通知客户还是管理内部沟通&#xff0c;自动化邮件系统都能显著提升工作效率。AokSend将详细介绍如何使用C发邮件&#xff0c;实现邮件自动化发送&#xff0c;帮助您轻松管理邮件通信…

车视界系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;汽车品牌管理&#xff0c;汽车颜色管理&#xff0c;用户管理&#xff0c;汽车信息管理&#xff0c;汽车订单管理系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;汽车信息&#xff0c;我…

4.1、FineReport单元格扩展和父子格

单元格扩展 1、配置数据集 2、纵向扩展 方法一&#xff1a; 方法二&#xff1a; 结果 多个字段纵向 2、横向扩展 方法一&#xff1a; 方法二&#xff1a; 结果 父子格 没什么特殊要求&#xff0c;就保持默认 1、右边的值默认以左边为左父格 2、下边的值默认以上边…

【Windows】如何取消显示Windows聚焦在桌面上生成的“了解此图片”图标

如下图所示&#xff0c;在更换Windows聚焦显示的时候&#xff0c;会在桌面多出一个“了解此图片”的图标&#xff0c;看着很烦&#xff0c;但又因为Windows聚焦自带的壁纸比其他主题的壁纸好看很多。 下面是消除办法&#xff1a; 打开注册表&#xff08;按WindowsR&#xff0…

【COSMO-SkyMed系列的4颗卫星主要用途】

COSMO-SkyMed系列的4颗卫星主要用于提供一个多用途的对地观测平台&#xff0c;服务于民间、公共机构、军事和商业领域。以下是这4颗卫星的主要用途&#xff1a; 民防与环境风险管理&#xff1a; 卫星的高分辨率雷达图像可用于监测自然灾害&#xff0c;如地震、洪水、滑坡等&am…

51单片机学习第六课---B站UP主江协科技

DS18B20 1、基本知识讲解 2、DS18B20读取温度值 main.c #include<regx52.h> #include"delay.h" #include"LCD1602.h" #include"key.h" #include"DS18B20.h"float T; void main () {LCD_Init();LCD_ShowString(1,1,"temp…

汽车革命下半场AI先锋:广汽为新“智”汽车装配大模型“底盘”

汽车革命的上半场是电动化&#xff0c;下半场是智能化&#xff0c;这是全球汽车产业普遍认同的观点。当前&#xff0c;我国汽车产业已经在电动化上半场取得了显著成效&#xff0c;在下半场智能化的全球战场能否胜出&#xff0c;关键看车企的创新意愿和研发实力。 在2024年9月1…

【Orange Pi 5嵌入式应用编程】-用户空间GPIO控制

用户空间GPIO控制 文章目录 用户空间GPIO控制1、嵌入式Linux的GPIO子系统介绍1.1 sysfs文件访问GPIO1.2 通过字符设备访问GPIO1.3 库与工具2、RK3588的GPIO介绍3、用户空间操作GPIO编程3.1 硬件准备3.2 通过libgpio操作GPIO3.2.1 GPIO输出3.2.3 GPIO输入3.2.3 边沿事件检测(中断…