<贪心算法>

前言:在主包还没有接触算法的时候,就常听人提起“贪心”,当时是layman,根本不知道说的是什么,以为很难呢,但去了解一下,发现也不过如此嘛(bushi),还以为是什么高级东西呢(开个玩笑,本蒟蒻只会点基础的)。本篇以一道简单题引入,不懂算法也会哦

题目:拼数  NC16783

思路: 本蒟蒻开始想当然了,以为直接以字符串从大到小排拼接起来就好了(有没有人和我一样),但没考虑全面。如特殊例子,A="321",B="32",若只按字符串大小拼接,则答案为“32132”,但正确答案应该是“32321”,所以还应该比较拼接后的大小,返回大的那一个

错误代码:

#include <iostream>
#include <algorithm>
using namespace std;
bool cmp(string a,string b){return a>b;
}
int main(){int n,i;string s[25];cin>>n;for(i=0;i<n;i++) cin>>s[i];sort(s,s+n,cmp);for(i=0;i<n;i++){cout<<s[i];}return 0;
}

正确代码:

#include <iostream>
#include <algorithm>
using namespace std;
bool cmp(string a,string b){return a+b>b+a;
}
int main(){int n,i;string s[25];cin>>n;for(i=0;i<n;i++) cin>>s[i];sort(s,s+n,cmp);for(i=0;i<n;i++){cout<<s[i];}return 0;
}

再来做一题感受一下吧

题目:华华听月月唱歌 NC23036

代码:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<pair<int,int> >pd;
int main(){int n,m,l,r,i,c=1;cin>>n>>m;for(i=0;i<m;i++){cin>>l>>r;pd.push_back({l,r});}sort(pd.begin(),pd.end());     //pair类型先按第一个元素排序,相等再按第二个if(pd[0].first!=1){  //若开头不是1,肯定不能修复cout<<-1;return 0;}l=1,r=1;for(i=0;i<m;i++){if(pd[i].first<=l){     //同一片段选终点最大的r=max(r,pd[i].second);}else{      //新的片段if(pd[i].first>r+1){   //不连续cout<<-1;return 0;}c++;l=r+1;  //新的l为上一段终点+1r=max(r,pd[i].second);   //更新r }if(r>=n){     //!!!及时结束!!!break;}} if(r<n){cout<<-1;return 0;}cout<<c;return 0;
}

贪心算法是一种在每一步选择中都采取当前状态下最优(如最小,最大…)的选择,从而希望导致结果是全局最优的算法,所以常常需要对元素进行排序(之前的最小生成树,Dijkstra算法求最短路径等就有利用)。

但贪心算法并不是对所有问题都适用。它只能在满足贪心选择性质和最优子结构性质的问题中有效。贪心选择性质是指问题的全局最优解可以通过局部最优解来得到;最优子结构是指问题的最优解包含其子问题的最优解。


还有和上面一题相似的活动安排问题也是贪心的经典题,但我暂时找不到合适的题目出处,就用【算法设计与分析】活动安排问题(动态规划和贪心算法)_活动安排 动态规划-CSDN博客这篇博客的截图了(正常应该会要我们自己排序)

问题描述:给定n个活动活动,每个活动都有一个开始时间和结束时间。目标是在一个空间内安排尽可能多的活动。

思路:将活动按结束时间从小到大排序,每次选择结束时间最早且与已安排的活动不冲突的活动(关键)

代码:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
bool cmp(pair<int,int>a,pair<int,int>b){return a.second<b.second;
}
int main(){int n,i,start,end;cin>>n;vector<pair<int,int> >events;for(i=0;i<n;i++){cin>>start>>end;events.push_back({start,end});}sort(events.begin(),events.end(),cmp);int count=0,endt=0;for(auto event:events){      //基于范围的for循环,event遍历events容器中的每个元素(C++11及以后的保准)if(event.first>=endt){   //与已安排活动不冲突count++;endt=event.second;}}cout<<count;return 0;
}

本篇我的第11行代码蓝色dev-c++是运行不了的,在文末我会推荐一款"新的"傻瓜集成开发环境。

 题目:排座椅  NC16618

 这怎么贪呢?有点想不出啊

思路:要使答案最优,就要让K条横线和L条竖线穿过尽可能多的会交头接耳的两个人。所以分别记录每行每列所能分割的学生对数,再从大到小排序即可。

代码:

#include<iostream>
#include<algorithm>
using namespace std;
struct jl{int index,num;
}row[1010],col[1010];    //row[index]存储index行能分割的学生对数
bool cmp1(jl a,jl b){return a.num>b.num;  //按分割数从大到小排
}
bool cmp2(jl a,jl b){return a.index<b.index;
}
int main(){int m,n,k,l,d;cin>>m>>n>>k>>l>>d;int x,y,p,q,i;for(i=0;i<d;i++){cin>>x>>y>>p>>q;if(x==p){        //行号相等,列计数+1y=min(y,q);col[y].index=y;col[y].num++;}else if(y==q){x=min(x,p);row[x].index=x;row[x].num++;}}sort(row,row+m+1,cmp1);sort(col,col+n+1,cmp1);sort(row,row+k,cmp2);        //再将k行按序号从小到大输出sort(col,col+l,cmp2);for(i=0;i<k;i++) cout<<row[i].index<<" ";cout<<endl;for(i=0;i<l;i++) cout<<col[i].index<<" ";return 0;
}

题目:矩阵消除游戏  NC200190

这题就有些复杂了,选的行会影响到剩下列和的值,只考虑选每一次的最优解,会影响到下一次的选择吧!我不是球球,帮不了呀。看了大佬的题解,我佬果然还是我佬

思路过程: 如果只按行选,或者只按列选,直接贪心就可以了。但没有交叉(只选行或只选列)只能保证选的数字最多,未必的最大的,例如:3  3  2   【【1  5  1】【5 5 5】【1 5 1】】。每次选最优解也不一定最大,例如:4 4 3【【 1 1 9 3】【 1 8 10 8】【1 2 7 2】【 1 2 2 2】】,先选第三列,然后选第二行和第四列,但是直接选选第二三四列结果更大。有点上一篇背包的意思,给你一个体积为V的背包,再给你若干件体积不同的物品,希望选一些物品尽量装满,你会上来就选择最大的吗?     

思路:   n,m都小于15,说明本题可以暴力枚举 。我们采用先枚举后贪心的方法, 先枚举所有行的情况(二进制枚举法),再贪心选择最多的前几列

二进制枚举——当每个个体都面对两种选择的时候,可以用一个01串表示,对于本题,每一行有选和不选两种可能,假设有5行的话,我们就可以用一个长度为5的01串来表示,0表示不选,1表示选,如:01001 表明选第2和第5行。二进制1的数量就是选取行的数量,二进制1的位置就是选取行的位置。长度为n的01串的十进制范围在0~2^n-1

代码:

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,k;
int a[20][20];
long long row[20],col[20];  //row[i]存储第i行数据的和
int flag[20];                   //标记所选行
int count(int x){int c=0;for(int i=0;i<n;i++){if(x&(1<<i)){           //位运算在A+B problem那一篇有介绍,大家也回顾一下flag[i+1]=1;        //当然也可以直接二进制转换c++;}else{flag[i+1]=0;}}return c;
}
bool cmp(long long a,long long b){return a>b;
}
int main(){int i,j;long long sum=0;           //该养成long long潜意识了cin>>n>>m>>k;for(i=1;i<=n;i++){for(j=1;j<=m;j++){cin>>a[i][j];row[i]+=a[i][j];sum+=a[i][j];}}if(k>=n||k>=m){          //k>=行或列,则可以选择全部cout<<sum;return 0;}sum=0;for(i=0;i<(1<<n);i++){   //遍历2^n种行选择情况long long ans=0;        //存储该种情况的最大分数int numh=count(i);      //该情况所选行数int numl=k-numh;if(numl>m||numl<0){     //这种情况不存在continue;     } for(j=1;j<=n;j++){if(flag[j]){ans+=row[j];}}memset(col,0,sizeof(col));for(j=1;j<=m;j++){      //计算选完行后的列和for(int h=1;h<=n;h++){if(!flag[h]){col[j]+=a[h][j];}}}sort(col+1,col+m+1,cmp);  for(j=1;j<=numl;j++){            ans+=col[j];  //从最后面(最大)开始加}sum=max(sum,ans);}cout<<sum;return 0;
}

下一题是一道提高组的题,本来觉得不好想,不分享算了。但它由特殊到一般推公式的思想还挺牛波一的,还是简单分析下思路,代码就贴我以前写的了

题目:国王的游戏  NC16561

思路: 以下图片截自一位牛客博主savage,据图,所以我们只需将ai​×bi从小到大排序,便能获得最多大臣的最小值。最后注意数据大小,利用之前学的高精度

 代码:

#include<iostream>
using namespace std;
string cheng(string a,string b){int lena=a.size(),lenb=b.size(),lenc=lena+lenb;string c(lenc,'0');int i,j;for(i=lena-1;i>=0;i--){for(j=lenb-1;j>=0;j--){int x=a[i]-'0',y=b[j]-'0';int num=x*y+c[i+j+1]-'0';c[i+j+1]=num%10+'0';c[i+j]+=num/10;}}c.erase(0,c.find_first_not_of('0'));return c;
}
void chu(string s,int b){int a[1000000],ans[100000];int len=s.size(),i,res=0;for(i=0;i<len;i++){a[i]=s[i]-'0';}for(i=0;i<len;i++){res=res*10+a[i];ans[i]=res/b;res%=b;}i=0;while(ans[i]==0){i++;}for(int j=i;j<len;j++){cout<<ans[j];}
}
int main(){int n,a,b,mx=0;cin>>n>>a>>b;string c=to_string(a);while(n--){cin>>a>>b;c=cheng(c,to_string(a));mx=max(mx,a*b);} chu(c,mx); return 0;
}  

我要分享的软件就是下图这个Embarcadero公司开发的Dev-C++,红色C++与蓝色C++里面内容操作都差不多,但是版本更高,支持C++11以后的版本,且傻瓜、使用简单,如果是初学者还不会使用其它编辑器的话,使用还是挺好的,兼容蓝色Dev-C++,下载链接我放在我的资源目录里了,需要自取

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

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

相关文章

大模型快速 ASGI 服务器uvicorn

基础概念类 1. 什么是 Uvicorn&#xff0c;它的作用是什么&#xff1f; 答案&#xff1a;Uvicorn 是一个基于 Python 的快速 ASGI&#xff08;异步服务器网关接口&#xff09;服务器。它的主要作用是作为 Web 应用程序的服务器&#xff0c;负责接收客户端的请求&#xff0c;并…

2025高频面试算法总结篇【二叉树】

文章目录 直接刷题链接直达非递归实现求二叉树的深度非递归从左至右打印一颗二叉树中的所有路径判断平衡二叉树二叉搜索树中第K小的元素二叉树的完全性检验根据前&中序遍历结果重建二叉树二叉树的最近公共祖先二叉树的直径二叉树的遍历 直接刷题链接直达 非递归实现求二叉…

redis 和 MongoDB都可以存储键值对,并且值可以是复杂json,用完整例子分别展示说明两者在存储json键值对上的使用对比

Redis 存储 JSON 键值对示例 存储操作&#xff1a; // 存储用户信息&#xff08;键&#xff1a;user:1001&#xff0c;值&#xff1a;JSON对象&#xff09; SET user:1001 {"name":"Alice", "age":30, "address":"New York&quo…

介绍几种创意登录页(含完整源码)

今天为大家收集了几种不同风格的登录页&#xff0c;搭配动态渐变背景&#xff0c;效果绝对惊艳&#xff01; CSS3实现动态渐变玻璃拟态登录页 一、开篇语 纯CSS实现当下最火的玻璃拟态(Morphism)风格登录页&#xff0c;搭配动态渐变背景&#xff0c;效果绝对惊艳&#xff01; …

R语言之mlr依赖包缺失警告之分析

因为本地没有网络&#xff0c;所有相关的依赖包都是手动下载&#xff0c;再使用脚本一键安装的。 在使用mlr包时&#xff0c;执行下面的代码时&#xff0c;总是报各种依赖缺失&#xff0c;也不知道咋看FAIL信息。 # 建模与调参 # 查阅线性回归、随机森林、xgboost和KNN四种模…

无状态版的DHCPv6是不是SLAAC? 笔记250405

无状态版的DHCPv6是不是SLAAC? 笔记250405 无状态版 DHCPv6 不是 SLAAC&#xff0c;但二者在 IPv6 网络中可协同工作。以下是核心区别与协作关系&#xff1a; 本质区别 特性SLAAC无状态 DHCPv6主要功能生成 IPv6 地址&#xff08;基于路由器通告的前缀&#xff09;分发 DNS、…

uniapp微信小程序地图marker自定义气泡 customCallout偶尔显示不全解决办法

这个天坑问题&#xff0c;在微信开发工具上是不会显示出来的,只有在真机上才会偶尔出现随机样式偏移/裁剪/宽长偏移&#xff0c;询问社区也只是让你提交代码片段&#xff0c;并无解决办法。 一开始我怀疑是地图组件加载出现了问题&#xff0c;于是给地图加了一个v-if"reL…

LabVIEW商业软件开发注意问题

在 LabVIEW 商业软件开发进程中&#xff0c;性能优化、界面设计及兼容性与扩展性&#xff0c;对软件品质、用户体验和市场适配性起着决定性作用。下面&#xff0c;借助多个LabVIEW 编程特性的实际案例&#xff0c;深入分析这些方面的开发要点。 一、性能优化&#xff1a;提升软…

Ubuntu 安装 VLC

最近项目中需要用VLC查看NVR下子设备的RTSP流&#xff0c;特此记录&#xff0c;便于日后查阅。 1、安装snap $ sudo apt update $ sudo apt install snapd 2、安装vlc $ sudo snap install vlc 3、可能遇到的问题 snap beta install on ubuntu 22.04 failing to start Qt: Se…

LeetCode 3047 求交集区域内的最大正方形面积

探寻矩形交集中的最大正方形面积 在算法与数据结构的探索之路上&#xff0c;二维平面几何问题一直占据着独特的地位&#xff0c;它们不仅考验我们的空间思维能力&#xff0c;还要求我们能够巧妙地运用算法逻辑。今天&#xff0c;我们将深入剖析一道极具代表性的二维平面几何算…

【Kafka基础】Kafka 2.8以下版本的安装与配置指南:传统ZooKeeper依赖版详解

对于仍在使用Kafka 2.8之前版本的团队来说&#xff0c;需要特别注意其强依赖外部ZooKeeper的特性。本文将完整演示传统架构下的安装流程&#xff0c;并对比新旧版本差异。 1 版本特性差异说明 1.1 2.8 vs 2.8-核心区别 特性 2.8版本 2.8-版本 协调服务 可选内置KRaft模式 …

springboot+easyexcel实现下载excels模板下拉选择

定义下拉注解 Target(ElementType.FIELD) Retention(RetentionPolicy.RUNTIME) public interface ExcelDropDown {/*** 固定下拉选项*/String[] source() default {};/*** 动态数据源key&#xff08;从上下文中获取&#xff09;*/String sourceMethod() default "";…

第15周:注意力汇聚:Nadaraya-Watson 核回归

注意力汇聚&#xff1a;Nadaraya-Watson 核回归 Nadaraya-Watson 核回归是一个经典的注意力机制模型&#xff0c;它展示了如何通过注意力权重来对输入数据进行加权平均。以下是该内容的核心总结&#xff1a; 关键概念 注意力机制框架&#xff1a;由查询&#xff08;自主提示…

adb devices报错 ADB server didn‘t ACK

ubuntu下连接手机首次使用adb devices 报错ADB server didn’t ACK adb devices * daemon not running; starting now at tcp:5037 ADB server didnt ACK Full server startup log: /tmp/adb.1000.log Server had pid: 52986 --- adb starting (pid 52986) --- 04-03 17:23:23…

Mac下Homebrew的安装与使用

Mac下Homebrew的安装与使用 一蓑烟羽 关注 2017.10.19 11:59* 字数 515 阅读 7684评论 0喜欢 3 Homebrew简介&#xff0c;安装与使用 简介 Homebrew 官方网站 Homebrew是一个包管理器&#xff0c;用于安装Apple没有预装但你需要的UNIX工具。&#xff08;比如著名的wget&am…

非常适合做后台项目的go脚手架

分享一个非常适合做后台脚手架的go项目&#xff0c;该项目使用gin作为mvc框架搭建。她就是Gin-vue-admin。该一个基于 vue 和 gin 开发的全栈前后端分离的开发基础平台&#xff0c;集成jwt鉴权&#xff0c;动态路由&#xff0c;动态菜单&#xff0c;casbin鉴权&#xff0c;表单…

优化 Django 数据库查询

优化 Django 数据库查询 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 优化 Django 数据库查询**理解 N+1 查询问题****`select_related`:外键的急加载**示例何时使用 `select_re…

大数据(5)Spark部署核弹级避坑指南:从高并发集群调优到源码级安全加固(附万亿级日志分析实战+智能运维巡检系统)

目录 背景一、Spark核心架构拆解1. 分布式计算五层模型 二、五步军工级部署阶段1&#xff1a;环境核弹级校验阶段2&#xff1a;集群拓扑构建阶段3&#xff1a;黄金配置模板阶段4&#xff1a;高可用启停阶段5&#xff1a;安全加固方案 三、万亿级日志分析实战1. 案例背景&#x…

【学Rust写CAD】36 颜色插值函数(alpha256.rs补充方法)

源码 pub fn alpha_lerp(self,src: Argb, dst: Argb, clip: u32) -> Argb {self.alpha_mul_256(clip).lerp(src, dst)}这个函数 alpha_lerp 是一个颜色插值&#xff08;线性插值&#xff0c;lerp&#xff09;函数&#xff0c;它结合了透明度混合&#xff08;alpha_mul_256&…

解决Ubuntu系统鼠标不流畅的问题

电脑是联想的台式组装机&#xff0c;安装ubuntu系统&#xff08;不管是16、18、20、22&#xff09;后&#xff0c;鼠标都不流畅。最近几天想解决这个问题&#xff0c;于是怀疑到了显卡驱动上。怀疑之前一直用的是集成显卡&#xff0c;而不是独立显卡&#xff0c;毕竟2060的显卡…