惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
Google Developers Blog
Cisco Talos Blog
Cisco Talos Blog
Y
Y Combinator Blog
罗磊的独立博客
Stack Overflow Blog
Stack Overflow Blog
MongoDB | Blog
MongoDB | Blog
GbyAI
GbyAI
The GitHub Blog
The GitHub Blog
S
SegmentFault 最新的问题
J
Java Code Geeks
C
CXSECURITY Database RSS Feed - CXSecurity.com
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
博客园 - 聂微东
B
Blog RSS Feed
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
P
Privacy & Cybersecurity Law Blog
L
LangChain Blog
L
LINUX DO - 热门话题
Hugging Face - Blog
Hugging Face - Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
P
Privacy International News Feed
F
Full Disclosure
S
Schneier on Security
T
Tenable Blog
量子位
NISL@THU
NISL@THU
Latest news
Latest news
V
Visual Studio Blog
C
Check Point Blog
aimingoo的专栏
aimingoo的专栏
博客园_首页
K
Kaspersky official blog
L
Lohrmann on Cybersecurity
美团技术团队
P
Proofpoint News Feed
P
Palo Alto Networks Blog
Spread Privacy
Spread Privacy
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Vercel News
Vercel News
人人都是产品经理
人人都是产品经理
The Hacker News
The Hacker News
AWS News Blog
AWS News Blog
S
Securelist
The Register - Security
The Register - Security
G
GRAHAM CLULEY
Project Zero
Project Zero
T
The Blog of Author Tim Ferriss
Recent Announcements
Recent Announcements
Engineering at Meta
Engineering at Meta
C
Cisco Blogs

faryou的博客

出租车上的对话 faryou的博客-告别小高一 faryou的博客-中考 · 竞赛 · 生活 · 思考 5月月考 - faryou的博客 - 日记 faryou的博客-五一回老家 【汇编 - 功能】中断安装中断实现 【汇编&硬件】时钟中断的具体实现 faryou的博客-这些年,我不再看《熊出没》 【汇编&硬件】关机中断的具体实现 【汇编&硬件】网络连接相关中断的具体实现 faryou的博客-年初小记 【汇编&硬件】鼠标控制中断的具体实现 【汇编&硬件】声音输出中断的具体实现 【汇编&硬件】屏幕输出中断的具体实现 【汇编&硬件】磁盘读取中断的具体实现 【汇编&硬件】键盘读取中断的具体实现 【汇编】汇编环境的搭建及Debug的使用教程 【汇编】漫谈:学习汇编后的一些思考 faryou的博客-关于本站即日起实行“一站三体”运营制度 【汇编基础教程】完结篇 写在最后:前言 【汇编基础教程】使用BIOS的中断实现键盘输入及磁盘I/O 【汇编基础教程】中断 【汇编基础教程】端口 【汇编基础教程】标志寄存器 【汇编基础教程】再谈栈 【汇编基础教程】段 【汇编基础教程】来存一些数据! 【汇编基础教程】寄存器和内存&一些基本命令的说明 【汇编基础教程】来写个“函数” 【汇编基础教程】更灵活的定位内存 【汇编基础教程】理解一下[bx]和loop指令 【汇编基础教程】跳一跳! faryou的博客-我的竞赛经历&对人生的一些思考 faryou的博客-关于现在中小学计算机课的一些想法及思考 faryou的博客-2025年度总结 faryou的博客-临平山下十五年 faryou的博客-Windows 10即将停止支持,谈谈自己从小到大用电脑的感受 faryou的博客-谈谈一名10后的怀旧情怀 【汇编基础教程】8086CPU工作原理 【C语言】指针的理解与应用 【算法教程】【C/C++】DP(动态规划):区间DP——程序设计思路与代码实现 【算法教程】【C/C++】BFS(广度优先搜索)——程序设计思路与代码实现 【算法教程】【C/C++】DFS(深度优先搜索)——程序设计思路与代码实现 【算法教程】【C/C++】单源最短路径——程序设计思路与代码实现 【算法教程】【C/C++】最小生成树——程序设计思路与代码实现 【算法教程】【C/C++】并查集——程序设计思路与代码实现 【算法教程】【C/C++】DP(动态规划):背包DP——程序设计思路与代码实现 【算法教程】【C/C++】DP(动态规划):简单动规问题——程序设计思路与代码实现 【算法教程】【C/C++】递推——程序设计思路与代码实现 【算法教程】【C/C++】三分算法——程序设计思路与代码实现 【算法教程】【C/C++】二分答案——程序设计思路与代码实现 【算法教程】【C/C++】二分查找——程序设计思路与代码实现 【算法教程】【C/C++】基础数学:快排——程序设计思路与代码实现 【算法教程】【C/C++】基础数学:快速幂——程序设计思路与代码实现 【算法教程】【C/C++】基础数学:进制转换——程序设计思路与代码实现 一文弄懂C++中的自定义函数 faryou的博客-2024年度总结
【算法教程】【C/C++】贪心算法——程序设计思路与代码实现
作者: faryou · 2024-04-30 · via faryou的博客

前言
贪心是算法中的一个重要思想,在之后的学习中,贪心都是一种解决问题的思路。今天,我们学习贪心算法。

程序设计思路
顾名思义,贪心算法是指在每个局部都采用最优解的方法,当然,这种解法对于整体来说并不一定最优解。例如下面这个问题就是典型的贪心算法解题:
你和一群硕鼠做交易,你要买12斤苹果,而以下三只硕鼠开出了三个价格,请你选择最优的方案:
第一只硕鼠:共有20斤苹果,其中4斤7元;
第二只硕鼠:共有10斤苹果,其中2斤3元;
第三只硕鼠:共有15斤苹果,其中5斤8元。
以上是一个很简单的贪心问题“硕鼠的交易”。很显然,我们要选择单价最为便宜的第二只硕鼠的单价进行交易,但因为第二只硕鼠总共只有10斤苹果,因此我们在买完了第二只硕鼠的苹果之后还需要再买价格第二便宜的第三只硕鼠的2斤苹果。

代码实现
202407081720432388338877.png
这题名叫删数问题。讲一下思路:因为要删到最小数,所以可以从左到右依次判断,如果左侧数大于右侧数,则删左侧数。之后继续判断。如果最后一个数最大,则删这个数。这种做法的思路就是使高位数小,整个数便也小了。这是贪心的思想。下面是代码实现:

#include <bits/stdc++.h>//定义头文件
using namespace std;
//说明:本人比较喜欢C风格的程序,因此没怎么涉及到C++的特性(如cout、cin、string等)
//by:faryou
char n[255];//因为位数很多,长整型显然无法存下250位,故使用字符串
int k,num=0,i=0;//k对应题目中的k,num为记录变量(记录剩余的位数,可以理解为右指针),i为指针(记录判断到的位数)
void del(int c){//删数函数,原理是将被删数右侧每一位都往左移动一位
    for(int i=c;i<=num;i++) n[i]=n[i+1];//将被删数右侧每一位都向左移位
    k--;//要删的数减少一个
    num--;//右指针减
}
int main(){
    scanf("%s%d",&n,&k);//读入数据
    while(n[num]!='\0') num++;//取总位数
    while(1){//死循环,之后有跳出条件
        if(k<=0) break;//当要删的数还剩0个时,结束循环
        if(n>n[i+1] && i!=num-1){//第一个条件判断前一个数大于后一个数,第二个防止超界
            del(i);//当左边数>右边数时,删左边数
            i=0;//从头开始判断
        }
        else if(n<=n[i+1] && i!=num-1) i++;//当前面条件不成立时,判断下一个数
        else if(i==num-1){//当判断到最后一个数时
            del(num-1);//删最后一个数
            i=0;//从头开始判
        }
    }
    while(n[0]=='0') del(0);//将前缀零删去
    if(n[0]=='\0') n[0]='0';//特判,如果前面0被删光了,添一个0
    printf("%s",n);//以字符串形式输出
    return 0;//结束程序
}

说明:个人喜欢使用C风格,因此此处使用了char数组存储数据,而且这里char比string方便(char数组末尾有'\0'做结束标识符,不需要再开一个变量存剩余位数,再拿for循环输出)。

总结
贪心算法本身不难,就是在某些解题思路上要大胆一些(多贪心)。在编写C++程序时,使用C风格也是一个不错的选择。我是faryou,再见!