算法设计与分析:贪心算法思想的应用

第1关:删除数字问题

任务描述
本关任务:掌握贪心算法的算法思想,并能利用贪心算法的算法思想解决删除数字问题。

给定n个纯数字组成的数字串,删除其中k(k<n)个数字后,剩下的数字按原来的秩序组成一个新的正整数,确定删除方案,使得剩下的数字组成的新的正整数最大。

相关知识
为了完成本关任务,你需要掌握:1.贪心算法的基本概念,2.贪心算法的基本思路步骤,3.删除数字问题求解思路。

贪心算法的基本概念
贪心算法又称之为贪婪算法,指的是在求解问题时,总是选择当前最好结果的方案,而不从整体考虑最优解法。贪心算法的两个基本要素分别是贪心选择和最优子结构。

贪心选择:求解问题的整体最优解可以通过一系列的局部最优的选择来实现,即贪心选择。
最优子结构:一个问题的最优解包含其子问题的最优解,称此问题具备最优子结构性质。
贪心算法的基本概念如下:

贪心算法是一种着眼局部的简单而适应范围有限的优化策略。
贪心算法在求解最优化问题时,从初始阶段开始,每一个阶段总是做一个使局部最优的贪心选择,不断把将问题转化为规模更小的子问题。也就是说贪心算法并不从整体最优考虑,每一阶段所做出的选择只是着眼于局部最优的选择。这样处理,对有些问题来说也能得到最优解,但也并不总是这样。
贪心选择性质:所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是一问题可用贪心算法求解的前提,也是贪心算法与动态规划算法的主要区别。
对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终能达到问题的整体最优。

贪心算法的基本思路步骤
根据贪心算法的基本概念,可以得到贪心算法的基本模型和执行步骤如下:

建立数学模型来描述问题;
把待求解的问题分成若干个子问题;
对每个子问题进行求解,得到子问题的局部最优解;
把子问题的局部最优解组合成原来问题的整体最优解。
删除数字问题求解思路
对于删除数字问题,第一次删除一个数字所得到的最大整数是当前的最优解,然后剩下的整数继续删除一个数字,得到的最大整数仍然是当前的最优解,以此类推,每次删除数字都选择得到当前最优解的策略。因此,最终删除k个数字后余下的最大整数即为整体的最优解。根据贪心算法的基本步骤,求解思路如下:

设大整数数组为a[0,1,..,n−1],每个数组元素表示大整数的一位,大整数的最高位为a[0],最低位为a[n−1],用赋值为−1来表示删除操作,例如a[1]=−1,则表示删除数组索引1处的数字;

求解n个纯数字组成的数字串删除k个数字后余下最大整数的问题,可以划分为k个子问题:删除1位数字后余下最大整数问题。

依次对每个子问题求解:从左往右查询(i=0→n−2),对于数组a中出现的第一个数据对a[i]<a[i+1],删除a[i]后余下的整数一定比删除a[i+1]后余下的整数要大(其余数字位置不变,相连两个数字中,删除小的数字a[i]后余下的整数a[0,1,..i−1,i+1,i+2,..n−1]一定比删除大的数字a[i+1]余下的整数a[0,1,..,i−1,i,i+2,..n−1]要大,因为新的整数在第i个位置上的数字前者大于后者)。为了实现方便,而不需要数组移位来形成新的整数,按先前的设定,将a[i]赋值为−1,往后的子问题在求解时注意跳过值为−1的数字。

k个子问题依次求解出最优解之后,得到的整数即为n个数字串删除k个数字后余下的最大整数。

上面第3步在求解k个子问题时用的是暴力尝试的方法,复杂度为O(k∗n),为了提高算法执行效率,可以维护每个子问题求解后i的位置,而不是每次都从头开始,这样子的算法复杂度为O(n+k),具体维护方法是:当a[i]=−1时,让i往左移(i=i−1),直到i=0或a[i]!=−1为止。

编程要求
本关的编程任务是补全右侧代码片段main中Begin至End中间的代码,具体要求如下:

在main中,读取大整数字符串并存入字符数组s,然后将字符数组s转换到整型数组a中。读取整数k(表示要删除k个数字),然后根据贪心策略,求解出删除k个数字后剩下的最大整数,并在一行输出。
测试说明
平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。

以下是平台的测试样例:

测试输入:
79502867154829179316 
8
预期输出:
987829179316

开始你的任务吧,祝你成功!

//
//  main.cpp
//  step1
//
//  Created by ljpc on 2018/12/8.
//  Copyright © 2018年 ljpc. All rights reserved.
//#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>using namespace std;int main(int argc, const char * argv[]) {char s[1001];int a[1001];int k;int n;// 请在这里补充代码,完成本关任务/********* Begin *********/int vis[1001];scanf("%s",s);scanf("%d",&k);int tempk=k;int len=strlen(s);for(int i=0;i<len;i++){a[i]=s[i]-48;vis[i]=0;}for(int i=1;i<len;i++){if(k==0)break;for(int j=i-1;j>=0;j--){if(k==0)break;if(a[i]>a[j]){if(vis[j]==0){k--;vis[j]=1;}}else break;}}for(int i=len-1;i>=0;i--)if(vis[i]==0&&k>0){k--;vis[i]=1;}for(int i=0;i<len;i++)if(vis[i]==0)printf("%d",a[i]);if(tempk>=len)printf("0\n");printf("\n");/********* End *********/return 0;
}

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

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

相关文章

VGG16

1️⃣ VGG介绍 Alexnet证明了神经网络变深是有效的&#xff0c;因此网络能不能更深更大&#xff1f;   VGG&#xff08;visual geometry group&#xff09;是由牛津大学提出的使用“块思想”的网络&#xff0c;通过使用循环和子程序可以很容易地在任何现代深度学习框架的代码…

Transformer多步时序预测:多变量输入,单变量输出

文章目录 Transformer类数据集类训练函数测试函数画图计算指标读取数据计时开始训练 数据集来源&#xff1a; https://github.com/zhouhaoyi/ETDataset import torch import torch.nn as nn import numpy as np import pandas as pd import math import time from sklearn.pre…

RabbitMq-队列交换机绑定关系优化为枚举注册

&#x1f4da;目录 &#x1f4da;简介:&#x1f680;比较&#x1f4a8;通常注册&#x1f308;优化后注册 ✍️代码&#x1f4ab;自动注册的关键代码 &#x1f4da;简介: 该项目介绍&#xff0c;rabbitMq消息中间件&#xff0c;对队列的注册&#xff0c;交换机的注册&#xff0c…

使用pyinstaller将python代码打包为exe程序

打包exe 对于不懂程序的人来说&#xff0c;可能有这样一个认识上的误区&#xff1a;只有能够直接打开的exe才是平常经常见到的程序&#xff0c;py文件不能算是程序。 在这种情况下&#xff0c;一些python的使用者可能非常苦恼&#xff1a;怎么才能够让我的程序&#xff0c;看…

博客搭建之路:hexo搜索引擎收录

文章目录 hexo搜索引擎收录以百度为例 hexo搜索引擎收录 hexo版本5.0.2 npm版本6.14.7 next版本7.8.0 写博客的目的肯定不是就只有自己能看到&#xff0c;想让更多的人看到就需要可以让搜索引擎来收录对应的文章。hexo支持生成站点地图sitemap 在hexo下的_config.yml中配置站点…

2-ZYNQ 折腾记录 -PMU

The AMD Zyng UltraScale MPSoC包括一个专用的用户可编程处理器&#xff0c;该平台测量单元(Platform Measurement Unit, PMU)处理器用于电源、错误管理和执行可选的软件测试库(Software Test Library, STL)用于功能安全应用。 PMU执行以下一组任务。启动前对系统的初始化。电…

Video-XL:面向小时级视频理解的超长视觉语言模型

在人工智能领域&#xff0c;视频理解一直是一个挑战性的任务&#xff0c;尤其是对于长时间视频内容的理解。现在&#xff0c;Video-XL的问世标志着我们在这一领域迈出了重要的一步。Video-XL是一个专为小时级视频理解设计的超长视觉语言模型&#xff0c;它能够处理超长视频序列…

BUUCTF之web篇

第一题 [极客大挑战 2019]EasySQL 打开靶机后可以看到这是一个登陆的页面 我们可以尝试两种方式登录 弱口令爆破&#xff08;burpsuite&#xff09; 通过SQL注入里的万能密码来跳过账户和密码验证的过程 这里就需要万能密码aor true # 在这里单引号的作用是结束用户名或者密码…

【Javaee】网络原理—http协议(一)

前言 本篇文章将详细介绍http协议&#xff0c;将介绍http抓包工具的下载与使用。 目录 一.http协议初识 1.概念 2.特点 1&#xff09;版本 2&#xff09;工作方式 二.http抓包工具 1.抓包是什么 2.抓包软件下载&#xff08;Fiddler&#xff09; 3.使用 三.http格式 …

04C++循环结构

//while 循环#include <iostream> using namespace std; int main() { int num0; while (num<10){ cout<<num<<endl; num; } return 0; } //do while语句 #include <iostream> using namespace std; int mai…

Appium中的api(一)

目录 1.基础python代码准备 1--参数的一些说明 2--python内所要编写的代码 解释 2.如何获取包名和界面名 1-api 2-完整代码 代码解释 3.如何关闭驱动连接 4.安装卸载app 1--卸载 2--安装 5.判断app是否安装 6.将应用放到后台在切换为前台的时间 7.UIAutomatorViewer的使用 1--找…

并联 高电压、高电流 放大器实现 2 倍输出电流模块±2A

1.1 并联输出电路设计注意事项 直接对两个功率运算放大器的输出进行硬接线并不是一种好的电气做法。如果两个运算放大器的输出直接连接在一起&#xff0c;则可能会导致不均匀的电流共享。这是因为其中的每个运算放大器都尝试强制施加略微不同的 Vout 电压&#xff0c;该电压取决…

vulnhub(16):sickos(两种打点方式)

端口 ip&#xff1a;192.168.72.154 nmap -Pn -p- 192.168.72.154 --min-rate 10000PORT STATE SERVICE 22 open ssh 3128 open http-proxy 8080 closed http-proxy web渗透方式一&#xff1a;web后台 正常访问80端口&#xff0c;是不开放的&#xff0c;我们需要配置…

高速定向广播声光预警系统赋能高速安全管控

近年来&#xff0c;高速重大交通事故屡见不鲜&#xff0c;安全管控一直是高速运营的重中之重。如何利用现代化技术和信息化手段&#xff0c;创新、智能、高效的压降交通事故的发生概率&#xff0c;优化交通安全管控质量&#xff0c;是近年来交管部门的主要工作&#xff0c;也是…

云原生Istio基础

一&#xff0e;Service Mesh 架构 Service Mesh&#xff08;服务网格&#xff09;是一种用于处理服务到服务通信的专用基础设施层。它的主要目的是将微服务之间复杂的通信和治理逻辑从微服务代码中分离出来&#xff0c;放到一个独立的层中进行管理。传统的微服务架构中&#x…

浅析Android View绘制过程中的Surface

前言 在《浅析Android中View的测量布局流程》中我们对VSYNC信号到达App进程之后开启的View布局过程进行了分析&#xff0c;经过对整个App界面的View树进行遍历完成了测量和布局&#xff0c;确定了View的大小以及在屏幕中所处的位置。但是&#xff0c;如果想让用户在屏幕上看到…

【十六进制数转十进制数 】

【十六进制数转十进制数 】 C语言版本C 版本Java版本Python版本 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 从键盘接收一个十六进制数&#xff0c;编程实现将其转换成十进制数。 输入 输入一个十六进制数 输出 输出一个十进制数 样…

GitHub 上的优质 Linux 开源项目,真滴硬核!

作为一名互联网人&#xff0c;提起 Linux 大家都不陌生&#xff0c;尤其是日常跟 Linux 操作系统打交道最多的&#xff0c;最熟悉不过了。互联网上关于 Linux 相关的教程和资料也非常的多&#xff0c;但是当你从中筛选出真正对自己有帮助的资料是需要花费很大精力与时间的。 G…

JVM基础(内存结构)

文章目录 内存结构JAVA堆方法区 &#xff08;Method Area&#xff09;运行时常量池&#xff08;Runtime Constant Pool&#xff09; 虚拟机栈 &#xff08;Java Virtual Machine Stack&#xff09;本地方法摘栈&#xff08;Native Method Stacks&#xff09;程序计数器&#xf…

交易的人生就是对未来不断的挑战!

在这个充满不确定性的市场中&#xff0c;我们每个人都渴望找到一条通往成功的路径。在Eagle Trader交易员中&#xff0c;有一位资深交易者&#xff0c;他不仅对交易有着不同寻常的执着和热爱&#xff0c;而且他的真诚见解和独到的交易哲学&#xff0c;可能会触动你的心弦。他的…