C语言学习--练习3(贪心)

news2025/6/19 0:22:27

目录

贪心算法

1. 两数对之间的最大乘积差

 2.三角形的最大周长

3.数组拆分

4.救生艇

 5.发送饼干

6.摆动数组


贪心算法

概念定义
        所谓贪心,总是做出在当前看来是最好的选择。也就是说,不从整体最优上进行考虑,算法得到的是在某种意义上的局部最优解。
        比如,对于一个全是正整数的数组,我要找到其中两个数,使得它们的乘积最大,毫无疑问,一定是取最大和次大的两个数进行相乘,得到的结果最大。这个就是贪心思想。
那么接下来,让我们做几道例题,来真正了解一下贪心。

1. 两数对之间的最大乘积差

int cmp(const void *a,const void *b){
    return *(int*)a-*(int*)b;
}
int maxProductDifference(int* nums, int numsSize){
    qsort(nums,numsSize,sizeof(int),cmp);//排序
    int n=numsSize;
    return abs(nums[n-1]*nums[n-2]-nums[0]*nums[1]);//贪心,直接取最前最后两个乘积差
}

/*
//直接找最大的两个数ab和最小的两数cd
int maxProductDifference(int* nums, int numsSize) {
    int a = 0, b = 0, c = 10001, d = 10001, i, t;
    for (i = 0; i < numsSize; i++) {
        t = nums[i];
        if (t > a)
            b = a, a = t;
        else if (t > b)
            b = t;
        if (t < d)
            c = d, d = t;
        else if (t < c)
            c = t;
    }
    return a * b - c * d;
}
*/

 2.三角形的最大周长

//遇到数组题目的第一件事就是先排序!!!
int cmp(const void *a,const void *b){
    return *(int*)a-*(int*)b;
}
//有些时候不要想太复杂了
int largestPerimeter(int* nums, int numsSize) {
    qsort(nums,numsSize,sizeof(int),cmp);
    //贪心找出边长最大的三个边
    for(int i=numsSize-1;i>1;i--){
        if(nums[i]<nums[i-1]+nums[i-2]){
            return nums[i]+nums[i-1]+nums[i-2];
        }
    }
    return 0;
}

3.数组拆分

 

//想想思路,在数对中取min后之和要最大,
//是不是感觉直接排序后取欸者的两个为一对就可以了
//直接试试(贪心)
//为什么证明过程相当复杂,
int cmp(const void*a,const void*b){
    return *(int*)a-*(int*)b;
}
int arrayPairSum(int* nums, int numsSize) {
    qsort(nums,numsSize,sizeof(int),cmp);
    int ans=0;
    for(int i=0;i<numsSize;i=i+2){//数对左边的是较小的min
        ans=ans+nums[i];
    }
    return ans;
}

 证明过程如下:
. - 力扣(LeetCode)

4.救生艇

int cmp(const void *a,const void *b){
    return *(int*)a-*(int*)b;
}
//贪心算法,两个人一条船,船少,
/*
方法一:贪心
要使需要的船数尽可能地少,应当使载两人的船尽可能地多。

设 people\textit{people}people 的长度为 nnn。考虑体重最轻的人:

若他不能与体重最重的人同乘一艘船,那么体重最重的人无法与任何人同乘一艘船,
此时应单独分配一艘船给体重最重的人。从 people 中去掉体重最重的人后,
我们缩小了问题的规模,变成求解剩余 n−1个人所需的最小船数,将其加一即为原问题的答案。

若他能与体重最重的人同乘一艘船,那么他能与其余任何人同乘一艘船,
为了尽可能地利用船的承载重量,选择与体重最重的人同乘一艘船是最优的。
从people 中去掉体重最轻和体重最重的人后,
我们缩小了问题的规模,变成求解剩余 n−2个人所需的最小船数,将其加一即为原问题的答案。

*/
int numRescueBoats(int* people, int peopleSize, int limit) {
    qsort(people,peopleSize,sizeof(int),cmp);
    int ans=0;
    int light=0,heavy=peopleSize-1;
    for(;light<=heavy;){
        if(people[heavy]+people[light]<=limit){//可以坐下最重的一个人+一个人
            ans++;
            light++;
            heavy--;
        }else{//坐不下
            ans++;
            heavy--;
        }//我看谁能和现在最轻的人一起
    }
    return ans;
}

 5.发送饼干

//不管不管,拿到数组先排序
int cmp(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),cmp);
    qsort(s,sSize,sizeof(int),cmp);
    int ans=0,i=0,j=0;

    while(i<gSize&&j<sSize){
        if(g[i]<=s[j]){
            ans++;
            i++;
            j++;
        }else{
            j++;
            }
    }
    return ans;
}

6.摆动数组

 


// 1 2 3 4 5 6 7 8 
//4  3  2  1
//  8  7  6  5
static int cmp(const void *pa, const void *pb) {
    return *(int *)pa - *(int *)pb;
}

void wiggleSort(int* nums, int numsSize) {
    int * arr = (int *)malloc(sizeof(int) * numsSize);
    memcpy(arr, nums, sizeof(int) * numsSize);
    qsort(arr, numsSize, sizeof(int), cmp);
    int x = (numsSize + 1) / 2;
    for (int i = 0, j = x - 1, k = numsSize - 1; i < numsSize; i += 2, j--, k--) {
        nums[i] = arr[j];
        if (i + 1 < numsSize) {
            nums[i + 1] = arr[k];
        }
    }
    free(arr);
}

 这题相当复杂,原理就是把前一半数重大到小插入偶数位,后一半的数重大到小插入奇数位,然后可以实现中间的数大于左右两边的数。具体为什么我也不晓得,证明过程太复杂不想看

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

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

相关文章

第三百九十一回

文章目录 1. 概念介绍2. 方法与细节2.1 实现方法2.2 具体细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何混合选择多个图片和视频文件"相关的内容&#xff0c;本章回中将介绍如何通过相机获取视频文件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. …

【数据库-黑马笔记】基础-SQL

本文参考b站黑马数据库视频,总结详细全面的笔记 ,可结合视频观看1~26集 MYSQL 的基础知识框架如下 目录 一、MYSQL概述 1、数据库相关概念 2、MYSQL的安装及启动 二、SQL 1、DDL【Data Defination】 2、DML【Data Manipulation】 ①、插入 ②、更新和删除 3、 DQL【Data…

【Scrapy】京东商品数据可视化

【Scrapy】京东商品数据可视化 文章目录 【Scrapy】京东商品数据可视化  &#x1f449;引言&#x1f48e;一、爬取数据&#xff1a;1.1 scrapy爬虫库简介&#xff1a;1.2 技术实现&#xff1a;1.2.1搭建框架结构1.2.2 分析网页结构 二、数据保存&#xff1a;三、数据读取以及…

【Algorithms 4】算法(第4版)学习笔记 16 - 4.2 有向图

文章目录 前言参考目录学习笔记1&#xff1a;介绍1.1&#xff1a;有向图简介1.2&#xff1a;应用举例1.3&#xff1a;相关问题2&#xff1a;有向图 API2.1&#xff1a;有向图表示2.1.1&#xff1a;邻接表数组 Adjacency-list2.1.2&#xff1a;Java 实现&#xff1a;邻接表数组2…

2024年k8s最新版本安装教程

k8s安装教程 1 k8s介绍2 环境搭建2.1 主机准备2.2 主机初始化2.2.1 安装wget2.2.2 更换yum源2.2.3 常用软件安装2.2.4 关闭防火墙2.2.5 关闭selinux2.2.6 关闭 swap2.2.7 同步时间2.2.8 修改Linux内核参数2.2.9 配置ipvs功能 2.3 容器安装2.3.1 设置软件yum源2.3.2 安装docker软…

C# OpenVINO Yolov8-OBB 旋转目标检测

目录 效果 模型 项目 代码 下载 C# OpenVINO Yolov8-OBB 旋转目标检测 效果 模型 Model Properties ------------------------- date&#xff1a;2024-02-26T08:38:44.171849 description&#xff1a;Ultralytics YOLOv8s-obb model trained on runs/DOTAv1.0-ms.yaml …

论文的引用书写方法

前置操作 1、全选文献 2、在开始选项卡 段落功能区 选择编号功能 3、设置编号格式 [1] 论文的引用 1、光标放在需要引用论文的地方 2、选择引用选项卡 点击交叉引用 3、引用类型为编号项 引用内容为段落编号 选择需要的第几条参考文献

Linux第74步_“设备树”下的LED驱动

使用新字符设备驱动的一般模板&#xff0c;以及设备树&#xff0c;驱动LED。 1、添加“stm32mp1_led”节点 打开虚拟机上“VSCode”&#xff0c;点击“文件”&#xff0c;点击“打开文件夹”&#xff0c;点击“zgq”&#xff0c;点击“linux”&#xff0c;点击“atk-mp1”&am…

数据库的筛选条件

【一】筛选过滤条件 【1】完整的查询语句 -- 查询当前表中的全部数据select * from 表名 where 筛选条件;​-- 查询当前表中的指定字段的数据select 字段名,字段名 from 表名 where 筛选条件;# 执行顺序from where select ​select 你选择的列1, 你选择的列2, ... from 查询的…

UVA191 Intersection 题解

UVA191 Intersection 题解 水紫&#xff0c;建议降蓝。 解法 求线段相交裸题&#xff0c;考虑使用向量解决。 我们把矩形的 4 4 4 个点两两相连&#xff0c;得到 6 6 6 条线段&#xff0c;如果先输入的线段和这 6 6 6 条线段都没有交点&#xff0c;则认为线段和矩形不相…

高度塌陷问题及解决

什么情况下产生 (when 父盒子没有定义高度&#xff0c;但是子元素有高度&#xff0c;希望用子盒子撑起父盒子的高度&#xff0c;但是子盒子添加了浮动属性之后&#xff0c;父盒子高度为0 <template><div class"father"><div class"son"&…

基于命名实体链接的事件抽取与知识图谱在电商领域的应用

开源项目推荐 多模态AI能力引擎平台: 免费的自然语言处理、情感分析、实体识别、图像识别与分类、OCR识别、语音识别接口&#xff0c;功能强大&#xff0c;欢迎体验。 多模态AI能力引擎平台: 免费的自然语言处理、情感分析、实体识别、图像识别与分类、OCR识别、语音识别接口…

代码还原之 函数

指令堆里逆向出来的代码有歧义&#xff0c;有三处返回&#xff0c;有嵌套IF语句&#xff0c;故推断出是个函数&#xff1b; #if 0/*27ec: 48 8d 3d 58 39 00 00 lea 0x3958(%rip),%rdi # 614b <_IO_stdin_usedBase0x14b> // rdi"COLUMNS"27f3: e8 e…

Express学习(三)

Express中间件 中间件的概念 什么是中间件 中间件&#xff0c;特指业务流程的中间处理环节。Express中间件的调用流程 当一个请求到达Express的服务器之后&#xff0c;可以连续调用多个中间件&#xff0c;从而对这次请求进行预处理。类似于下图所示 Express中间件的格式 Expr…

安卓SDK dx工具生成dex文件命令

目录 前言一、添加到环境变量二、命令示例 前言 在Android SDK 工具中&#xff0c;dx命令用于将Java字节码文件转换为Dalvik Executable&#xff08;dex&#xff09;文件&#xff0c;以便在Android设备上运行。 一、添加到环境变量 找到想要使用的SDK版本&#xff0c;将dx.b…

C++11 新特性 增加数据类型

一.C11 新增加数据类型介绍 在C11中&#xff0c;新增了long long、unsigned long long、char16_t和char32_t等数据类型&#xff0c;它们可以支持更宽的整型和字符表示。 long long&#xff1a;long long是一种整数类型&#xff0c;它至少可以存储64位&#xff08;8字节&#x…

Offer必备算法12_链表_五道力扣题详解(由易到难)

目录 ①力扣2. 两数相加 解析代码 ②力扣24. 两两交换链表中的节点 解析代码 ③力扣143. 重排链表 解析代码 ④力扣23. 合并 K 个升序链表 解析代码1&#xff08;小根堆优化&#xff09; 解析代码2&#xff08;递归_归并&#xff09; ⑤力扣25. K 个一组翻转链表 解…

【从部署服务器到安装autodock vina】

注意&#xff1a;服务器 linux系统选用ubuntu 登录系统&#xff0c;如果没有图形化见面可以先安装图形化界面 可以参考该视频 --> linux安装图形化界面 非阿里云ubuntu 依次执行以下命令 sudo apt-get update sudo apt-get install gnome sudo reboot阿里云ubuntu 需多执…

Glip模型

Yolos 完全使用Transformer做目标检测 Detr 先使用CNN提取特征然后再使用transformerDetr和Yolos共同的缺点:需要事先知道所有的类别 Glip Zero-shot, 目标检测的类别可以不在训练类别中目标框进行视觉编码,然后和文本进行匹配文本和视觉特征是通过Clip模型提取的,所以视觉向…

从功能测试进阶自动化测试全套进阶指南,亲身经验分享

因为我最近在分享自动化测试技术&#xff0c;经常被问到&#xff1a; 功能测试想转自动化&#xff0c;请问应该怎么入手&#xff1f;有没有好的资源推荐&#xff1f; 那么&#xff0c;接下来我就结合自己的经历聊一聊我是如何在工作中做自动化测试的。&#xff08;学习路线放…