当前位置: 首页 > news >正文

分发饼干问题——用贪心算法解决

目录

一:问题描述

二:解决思路

贪心策略(C语言)算法复习总结3——贪心算法-CSDN博客

 三:代码实现

四:复杂度分析


一:问题描述

分发饼干问题是一个经典的可以使用贪心算法解决的问题,问题描述如下:

有一群孩子和一堆饼干,每个孩子都有一个胃口值 g[i](表示该孩子需要的饼干的最小尺寸才能满足),每个饼干都有一个尺寸 s[j]。目标是尽可能让更多的孩子得到满足,即找到能满足的孩子的最大数量。也就是说,要将饼干分配给孩子,当且仅当饼干的尺寸大于或等于孩子的胃口值时,这个孩子才能被满足。(每个孩子最多一块饼干)

二:解决思路

贪心策略(C语言)算法复习总结3——贪心算法-CSDN博客

贪心策略是优先满足胃口值小的孩子。因为对于胃口值小的孩子,更容易找到合适尺寸的饼干来满足他,这样可以尽量让更多的孩子得到满足。具体步骤如下:

  1. 对孩子的胃口值数组 g 和饼干尺寸数组 s 分别进行排序(升序)。
  2. 用两个指针分别遍历孩子数组和饼干数组。
  3. 从胃口值最小的孩子开始,尝试用最小尺寸的饼干去满足他。如果当前饼干的尺寸大于或等于当前孩子的胃口值,那么这个孩子就被满足,两个指针都向后移动一位;如果当前饼干的尺寸小于当前孩子的胃口值,说明这个饼干不能满足这个孩子,只能尝试下一个更大尺寸的饼干,即只移动饼干数组的指针。
  4. 重复步骤 3,直到遍历完所有孩子或者所有饼干。

 三:代码实现

#include <stdio.h>
#include <stdlib.h>

// 比较函数,用于 qsort 排序
int compare(const void *a, const void *b) {
    return (*(int *)a - *(int *)b);
}

// 解决分发饼干问题的函数
int findContentChildren(int* g, int gSize, int* s, int sSize) {
    // 对孩子的胃口值数组和饼干尺寸数组进行排序
    qsort(g, gSize, sizeof(int), compare);
    qsort(s, sSize, sizeof(int), compare);

    int child_index = 0;
    int cookie_index = 0;
    // 遍历孩子和饼干数组
    while (child_index < gSize && cookie_index < sSize) {
        if (s[cookie_index] >= g[child_index]) {
            // 当前饼干能满足当前孩子,孩子和饼干指针都后移
            child_index++;
            cookie_index++;
        } else {
            // 当前饼干不能满足当前孩子,只移动饼干指针
            cookie_index++;
        }
    }
    return child_index;
}

int main() {
    int g[] = {1, 2, 3};
    int s[] = {1, 1};
    int gSize = sizeof(g) / sizeof(g[0]);
    int sSize = sizeof(s) / sizeof(s[0]);
    int result = findContentChildren(g, gSize, s, sSize);
    printf("能满足的孩子数量是: %d\n", result);
    return 0;
}
    

四:复杂度分析

  • 时间复杂度:排序操作的时间复杂度为 (O(n log n + m log m)),其中 n 是孩子的数量,m 是饼干的数量。遍历数组的时间复杂度为 (O(min(n, m)))。所以总的时间复杂度为 (O(n log n + m log m))
  • 空间复杂度qsort 函数通常需要 (O(log n + log m)) 的额外空间,因此总的空间复杂度为 (O(log n + log m))

相关文章:

  • Oracle 11G RAC 删除添加节点(一):删除节点
  • 智能SEO关键词AI精准布局
  • swagger 注释说明
  • LeetCode 34 在排序数组中查找元素的第一个和最后一个位置
  • 【5G学习】5G中常说的上下文之上下文响应
  • 在线地图支持天地图和腾讯地图,仪表板和数据大屏支持发布功能,DataEase开源BI工具v2.10.7 LTS版本发布
  • java中的Future的设计模式 手写一个简易的Future
  • C语言 ——— 认识C语言
  • 应对海量数据归档难题?AWS Glacier 的低成本冷存储解决方案实践指南
  • Keras使用1
  • 【AI学习从零至壹】语⾔模型及词向量相关知识
  • linux多线(进)程编程——(6)共享内存
  • 链表代码实现(C++)
  • C语言--常见的编程示例
  • 医药采购系统平台第5天01:药品目录导入功能的实现Oracle触发器的定义供货商药品目录模块的分析供货商目录表和供货商控制表的分析、数据模型设计和优化
  • Rasa 模拟实现超简易医生助手(适合初学练手)
  • Tkinter表格与列表框应用
  • 制作像素风《饥荒》类游戏的整体蓝图和流程
  • ubuntu 2404 安装 vcs 2018
  • Doris 安装部署、实际应用及优化实践:对比 ClickHouse 的深度解析
  • 体重管理门诊来了,瘦不下来的我们有救了?|健康有方FM
  • 住房和城乡建设部办公厅主任李晓龙已任部总工程师
  • 蔡澜回应“入ICU观察”称未至于病危,助理:只是老毛病
  • 海尔智家一季度营收791亿元:净利润增长15%,海外市场收入增超12%
  • 2025上海车展 | 当智驾不再让人兴奋,汽车智能化暗战升级
  • 成都警方:在地铁公共区域用改装设备偷拍女乘客,男子被行拘