贪心算法笔记

devtools/2024/10/25 17:27:30/

算法>贪心算法

根据b站视频整理的
视频地址:https://www.bilibili.com/video/BV1f84y1i7mv/?spm_id_from=333.337.search-card.all.click&vd_source=6335ddc7b30e1f4510569db5f2506f20

原理拆解:

1.根据当前情况,做出一步最佳选择;
2.做出选择,永不改变、后悔(区别回溯算法会后悔)
3.如此循环,用局部最优解,逐步得到整体最优解。

算法1(入门):

海盗船打劫商船,每件宝物的价值相同,但重量不同(8,20,5,45,47,90,890,60),海盗船最大承受重量为500,问:最大装几件宝物?

#include <stdio.h>
#include <algorithm>
int main(){int data={820545479089060};int max=500;int count=sizeof(data)/sizeof(data[0]);  //计算数组长度std::sort(data,data+count);  //排序接口int n=0;//记录宝物个数int temp=0;//已装宝物重量for(int i=0;i<count;i++){temp+=data[i];if(temp>max) break;n++;}cout<<"最大宝物个数:"<<n;return 0;
}

算法2(初级):

一个很长的花坛,一部分地已经种植了花,另一部分却没有。花不能种植在相邻的地块上否则它们会争夺水源,两者都会死去。
给你一个整数数组表示花坛由若干0和1组成0表示没种植花,1表示种植了花。
给定一个数n能不能种下n朵花?

#include<stdio.h>bool canZ(int *data, int n){int i;int datasize=sizeof(data)/sizeof(data[0]);if (n==0) return true;int count=0;while(i<datasize){if(data[i]==1) i+=2;else if(i>0&data[i-1]==1) i+=1;// 左边有花,走一步else if(i+1<datasize&data[i+1]==1) i+=3; // 右边有花,走三步esle return true;}return false;
}int main(){int *data={1,0,0,0,1,0,1,0,0,0,0,0,1}if(canZ(data,4)) cout<<"OK";else cout<<"NO";return 0;
}

算法3(中级):

给定一个整数数组,表示在同一行的行星。
每一个元素,其绝对值表示行星的大小正负表示行星的移动方向正表示向右移动,负表示向左移动每一颗行星以相同的速度移动。
碰撞规则:
1、两个行星碰撞,较小的行星会爆炸。
2、如果大小相同,则两颗都会爆炸。
3、两颗移动方向相同的行星,永远不会发生碰撞。

#include<stdio.h>
#include<stdlib.h>
#include<math.h>int *collision(int *data,int datasize,int *retsize){int n=0;//记录爆炸次数while(1){int pre=0;int next=0;while(next<datasize){if(data[pre]*data[next]<0){ // 运动方向相反if(data[pre]<0){ // 左边向左,右边想右,不会碰撞pre=next;next++;continue;}}				else if(abs(data[pre]) < abs(data[next])){ // 发生碰撞了,小的爆炸data[next]=0;n++;}else if(abs(data[pre]) > abs(data[next])){ // 发生碰撞了,小的爆炸data[pre]=0;n++;}else { // 发生碰撞了,相同大小的爆炸data[pre]=0;data[next]=0;n+=2;}break;	}if(data[pre]==0){ // 左边已经碰撞了pre=next;next++;}else if(data[next]==0){ // 右边已经碰撞了next++;}else{ // 方向相同pre=next;next++;}if(next>=datasize)break;}int *retsize=datasize-n;int *retArray=(int *)malloc(*retsize * sizeof(int)); // 分配一个存储数组for(int i=0,k=0;i<size;i++){if(data[i])retArray[k++]=data[i];}
}int main(){int data[]={10,2,-5};int size;int *ret=collision(data,3,&size);for(int i=0;i<size;i++){printf("%d",ret[i]);}return 0;
}

后续继续更新…


http://www.ppmy.cn/devtools/128737.html

相关文章

编程语言有哪些分类?C语言和其他编程语言的区别?到底什么是高级语言,什么是低级语言?C语言是如何创造出来的?

编程语言有哪些分类? 编程语言发展有打孔卡片、机器语言、汇编语言和高级语言这几种形态。高级语言对于程序员更友好&#xff0c;发展的形态五花八门。从编程方式看&#xff0c;有命令式、函数式和逻辑式三种。 命令式以常见的C/C/Java/C#/Python/JavaScript/Go/Rust等为代表&…

502 错误码通常出现在什么场景?

服务器过载场景 高流量访问&#xff1a;当网站遇到突发的高流量情况&#xff0c;如热门产品促销活动、新闻热点事件导致网站访问量激增时&#xff0c;服务器可能会因承受过多请求而无法及时响应。例如&#xff0c;电商平台在 “双十一” 等购物节期间&#xff0c;大量用户同时…

FLINK 合流

在Apache Flink中&#xff0c;合流&#xff08;Co-streaming&#xff09;是指将两条或多条数据流合并成一条数据流的操作。这种操作在实际应用中非常普遍&#xff0c;特别是在需要联合处理来自不同源头的数据时。Flink提供了多种合流方式&#xff0c;以满足不同的数据处理需求。…

C语言 | Leetcode C语言题解之第498题对角线遍历

题目&#xff1a; 题解&#xff1a; int* findDiagonalOrder(int** mat, int matSize, int* matnSize, int* returnSize) {int m matSize;int n matnSize[0];int *res (int *)malloc(sizeof(int) * m * n);int pos 0;for (int i 0; i < m n - 1; i) {if (i % 2) {int…

魔珐携手阿里巴巴亮相2024 Gitex,展示3D数字人AIGC前沿技术

近日&#xff0c;魔珐科技与阿里巴巴强强联合&#xff0c;在2024年Gitex展览会上震撼登场&#xff0c;共同展出了最先进的3D数字AIGC技术成果。此次合作以定制化的3D数字人形象&#xff0c;介绍了有言高质量视频的快速生成&#xff0c;吸引了来自全球的观众驻足体验。 通过参展…

Golang文件操作:读取与写入全攻略

文章目录 1. 文件操作基础2. 文件的打开和创建2.1 打开文件2.2 创建文件 3. 文件写入操作3.1 使用os.File.WriteString写入字符串3.2 使用bufio进行缓冲写入 4. 文件读取操作4.1 按行读取文件4.2 一次性读取整个文件 5. 文件权限与打开模式详解5.1 使用os.OpenFile设置文件打开…

浅谈c#编程中的异步编程

个人简介:本人多年从事研发和测试领域工作,有一定的经验; 口号:懒人推动科技进步,学习编程啊脚本啊目的就是要将人从做相同的工作脱离出来,手懒可以但是脑子不能懒,让重复的事情自动完成,能动一下就完成任务就不能动两下,懒到极致才是目标! 方向:本人不怎么将理论的…

vite 学习笔记

视频资料&#xff1a;https://www.bilibili.com/video/BV1BS4y1P7mU/?spm_id_from333.337.search-card.all.click&vd_source707ec8983cc32e6e065d5496a7f79ee6 1-2. Vite学习指南 https://www.bilibili.com/video/BV1BS4y1P7mU/?spm_id_from333.337.search-card.all.clic…