C++ 搬水果贪心算法实现代码

C++搬水果贪心算法实现代码的攻略如下:

什么是贪心算法?

贪心算法(Greedy Algorithm)又称贪心策略,是指在利用当前信息的情况下,做出当下最优的选择。贪心算法不会考虑到全局的最优解,而只关注当下的最优解。贪心算法在求解最优解的过程中,通常需要证明其正确性,并且使用贪心算法求得的解不一定是全局最优解,但是可以得到比较优秀的近似解。

搬水果问题的贪心策略

搬水果问题的场景是这样的:有m个果篮,每个果篮最多放n个水果,有k个水果需要放入果篮,每个水果的重量为w[i],每个果篮最多承载重量为c。为了最省力地搬运水果,需要考虑如何将水果分配到果篮中。我们可以用贪心算法解决这个问题。

首先,将水果按照重量从大到小排序;

然后,按照排好序的顺序把水果依次放入每个果篮中,如果放入当前果篮后,果篮所承载的水果重量超过了c,则新开一个果篮继续放入水果;

最后,返回果篮的数量即可。

代码实现如下:

#include <cstdio>
#include <queue>
#include <algorithm>
using namespace std;

const int N = 100010;

int n, m, k, c;
int w[N];

bool cmp(int a, int b){
    return a > b;
}

int main(){
    scanf("%d %d %d %d", &n, &m, &k, &c);
    for(int i = 0; i < k; ++i) scanf("%d", &w[i]);
    sort(w, w + k, cmp);  // 按照重量从大到小排序
    int res = 0;
    priority_queue<int> q;
    for(int i = 0; i < k; ++i){
        if(q.size() < n){  // 还有空篮子,则直接放入
            q.push(w[i]);
        }
        else{  // 没有空篮子,则看能不能放到已有的篮子中
            int x = q.top();  // 取出当前承重最大的篮子
            q.pop();  // 移除篮子
            x += w[i];  // 将当前水果加入篮子
            q.push(x);  // 将篮子放回
        }
    }
    while(q.size()){  // 统计篮子数量
        if(q.top() <= c) res++;
        q.pop();
    }
    printf("%d\n", res);
    return 0;
}

示例说明

假设有4个篮子,每个篮子最多放2个香蕉,现有6个香蕉,重量分别为10, 8, 5, 4, 3, 2。篮子的承重量为15,如果使用贪心策略,需要将香蕉放入篮子中,求出最少需要几个篮子?

按照贪心策略,根据香蕉重量从大到小排序后,首先把重量最大的香蕉(10)放入篮子中;然后将重量第二大的香蕉(8)放入篮子中;此时篮子已经满了,需要另开一个篮子,将重量第三大的香蕉(5)放入新开的篮子中,此时篮子数为2;接着将重量第四大的香蕉(4)放入之前较轻的篮子中,此时篮子数仍为2;以此类推,将剩下的两个香蕉放入篮子中后,一共使用了2个篮子。

假设有3个篮子,每个篮子最多放3个橘子,现有7个橘子,重量分别为5, 4, 3, 2, 1, 1, 1。篮子的承重量为9,如果使用贪心策略,需要将橘子放入篮子中,求出最少需要几个篮子?

按照贪心策略,根据橘子重量从大到小排序后,首先把重量最大的橘子(5)放入篮子中;然后将重量第二大的橘子(4)放入篮子中;此时篮子已经满了,需要另开一个篮子,将重量第三大的橘子(3)放入新开的篮子中,此时篮子数为2;接着将剩下的4个橘子(2,1,1,1)依次放入已有的篮子中,篮子数仍为2;总共使用了2个篮子。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ 搬水果贪心算法实现代码 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • C++实现高校人员信息管理系统

    C++ 实现高校人员信息管理系统 高校人员信息管理系统是一款常用的管理软件,它可以帮助高校管理人员和教师更加方便和快捷地管理学生和教职工的基本信息。本攻略将对该系统的实现进行详细讲解。 1.需求分析 首先,我们需要明确系统需要管理的基本信息,包括学生、教师和职工的姓名、性别、出生日期、学号(教职工号)、家庭住址等信息。 其次,系统需要支持添加、删除、修改学生…

    C 2023年5月23日
    00
  • 一文带你玩转Java异常处理

    一文带你玩转Java异常处理 异常处理概述 Java中的异常处理机制是在程序执行中检测到错误时采取的一种机制,用于保证程序在异常情况下能够进行有序的处理。通常来说,异常可以分为两种:检查异常(Checked Exception)和运行时异常(Runtime Exception)。其中,检查异常必须在代码中进行处理,而运行时异常可以不处理。Java中的异常处理…

    C 2023年5月23日
    00
  • 深入理解C++模板如何实现多态思想

    深入理解C++模板如何实现多态思想 C++模板是一种高度通用化的编程工具,除了可以用来实现代码复用之外,还可以用来实现多态的编程思想。在这里,我将详细介绍如何使用C++模板来实现多态的思想,涵盖泛型编程、函数模板、类模板等方面。 一、泛型编程泛型编程是C++模板多态思想的最基本组成部分,其核心思想是将数据类型与算法分离,从而实现代码的通用化。在使用C++模板…

    C 2023年5月23日
    00
  • C++实现单词管理系统

    C++实现单词管理系统攻略 1. 系统需求 单词管理系统是一个简单的程序,它可以实现以下功能: 添加单词及其译文; 查询单词及其译文; 修改单词及其译文; 删除单词及其译文; 显示所有单词及其译文。 2. 环境配置 C++实现单词管理系统需要一个C++编译器以及一个可以运行C++程序的操作系统。以下是可能使用的一些工具: 编译器:Visual Studio、…

    C 2023年5月23日
    00
  • 如何寻找数组中的第二大数

    如何寻找数组中的第二大数是一个比较常见的问题。下面我将为大家详细讲解如何寻找数组中的第二大数的完整攻略。 1. 题目理解 首先需要明确题目的意思。题目所说的数组是一个由整数组成的序列。其次,题目要求找到数组中第二大的数,也就是说要找到所有元素中第二大的数。 2. 方法总结 如何在一个数组中找到第二大的数呢?下面是一些比较常见的方法: 方法一:排序 排序是一种…

    C 2023年5月23日
    00
  • 解决异常FileNotFoundException:class path resource找不到资源文件的问题

    当我们在Java代码中引用一些资源文件(如XML、properties、txt等)时,有时候会出现FileNotFoundException: class path resource的异常,这是因为JVM在查找资源的时候默认是在当前类路径下寻找资源,如果找不到就会报这个异常。下面提供一个完整的攻略来解决这个问题: 1. 确认资源文件路径 首先,我们需要明确我…

    C 2023年5月23日
    00
  • C++实现蓝桥杯竞赛题目—搭积木

    C++实现蓝桥杯竞赛题目—搭积木的完整攻略 题目描述 假设你们班有很多童鞋正在参加蓝桥杯竞赛,老师突然想了个好玩的游戏:大家一起来玩搭积木,规则如下:每个学生手里都有 $n$ 个积木,编写程序按照如下规则输出: 第一行输出所有积木的高度和; 第二行将所有积木按高度升序输出; 第三行将所有积木按高度降序输出; 第四行随机输出所有积木。 程序实现 首先,因为…

    C 2023年5月23日
    00
  • OpenGL 图像 lookup 色彩调整

    零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录  >> OpenGL ES 基础 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录  >> OpenGL ES 特效 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录  >> OpenGL ES …

    C语言 2023年4月18日
    00
合作推广
合作推广
分享本页
返回顶部