【贪心算法】洛谷P1106 - 删数问题

2025 - 01 - 22 - 第 46 篇
【洛谷】贪心算法题单 - 【贪心算法】 - 【学习笔记】
作者(Author): 郑龙浩 / 仟濹(CSND账号名)

目录

文章目录

  • 目录
  • P1106 删数问题
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
    • 提示
    • 思路
    • 代码

P1106 删数问题

题目描述

键盘输入一个高精度的正整数 n n n(不超过 250 250 250 位),去掉其中任意 k k k 个数字后剩下的数字按原左右次序将组成一个新的非负整数。编程对给定的 n n n k k k,寻找一种方案使得剩下的数字组成的新数最小。

输入格式

输入两行正整数。

第一行输入一个高精度的正整数 n n n

第二行输入一个正整数 k k k,表示需要删除的数字个数。

输出格式

输出一个整数,最后剩下的最小数。

样例 #1

样例输入 #1

175438 
4

样例输出 #1

13

提示

len ⁡ ( n ) \operatorname{len}(n) len(n) 表示 n n n位数,保证 1 ≤ k < len ⁡ ( n ) ≤ 250 1 \leq k < \operatorname{len}(n) \leq 250 1k<len(n)250

思路

删除任意k个数字以后,如何保证是最小的数呢,如何去掉呢????
思路是这样的,从做往右(高位到低位)依次两两比较,如果 arr[ i ] <= arr[ i + 1 ], 则无需管,直到遇到 arr[ i ] > arr[ i + 1 ], 这时候需要将 arr[ i + 1 ] 去掉
说白了,就是尽量让这个数字保持升序,这样才能保证最小 --> 高位数字小 --> 则整个数字小

所以,去掉的数字一般分为两种情况

  1. 在 i ~ num - 1 的范围内, 【有】 arr[ i ] > arr[ i + 1 ] 的清况 --> 去掉arr[ i + 1 ]
  2. 在 i ~ num - 1 的范围内, 【无】 arr[ i ] > arr[ i + 1 ] 的清况 --> 去掉最后一位 --> 为什么是去掉最后一位呢,因为数字顺序为升序的时候,最右侧的数字是最大的,所以去掉
    ( 第 2 种情况 也无需再单独去判断了,因为内层循环中如果找不到arr[ i ] <= arr[ i + 1 ],退出循环的时候,i 会定位在 倒数第二个元素上面 )

最右侧的数字相当于 --> 整个高精度正数少了一位 + 少了最大的数

程序过程:

  1. 最外层循环:用来控制循环次数 --> 循环 k 次 --> 删掉 k 个数字
  2. 最内层循环:用来寻找 arr[ i ] < arr[ i + 1 ] 的情况,如果遇到,则退出循环,将 i 定位在 5 处( 比如 1 2 3 4 5 1 ),退出循环以后将 5 删除即可

借用的函数: erase(a, b) --> 删除函数 --> STL容器

高峰期–> 我的理解就是 从左往右依次两两比较,只要遇到不是 arr[ i ] <= arr[ i + 1 ] 而是 arr[ i ] > arr[ i + 1 ], 则 arr[ i ] 就是这个高峰期
简单点说,就是尽可能的让高位数字的顺序为升序 --> 因为 高位数字小, 则整个 高精度数字 就小

变量:
arr --> 存放高精度正整数
k --> 要删除的数字的数量
i --> 决定 高峰 的位置

代码

// 洛谷P1106 删数问题
// 作者: 郑龙浩 / 仟濹(CSDN)
// 时间:2025 - 01 -22
// 键盘输入一个高精度的正整数 n(不超过 250 位),去掉其中任意 k 个数字后剩下的数字按原左右次序将组成一个新的非负整数。编程对给定的 n 和 k,
// 寻找一种方案使得剩下的数字组成的新数最小。// 看的这个大佬的题解,我才会这么做的 https://www.luogu.com.cn/article/qgschm0n// 思路:
// 删除任意k个数字以后,如何保证是最小的数呢,如何去掉呢????
// 思路是这样的,从做往右(高位到低位)依次两两比较,如果 arr[ i ] <= arr[ i + 1 ], 则无需管,直到遇到 arr[ i ] > arr[ i + 1 ], 这时候需要将 arr[ i + 1 ] 去掉
// 说白了,就是尽量让这个数字保持升序,这样才能保证最小 --> 高位数字小 --> 则整个数字小// 所以,去掉的数字一般分为两种情况
// 1. 在 i ~ num - 1 的范围内, 【有】 arr[ i ] > arr[ i + 1 ] 的清况 --> 去掉arr[ i + 1 ]
// 2. 在 i ~ num - 1 的范围内, 【无】 arr[ i ] > arr[ i + 1 ] 的清况 --> 去掉最后一位 --> 为什么是去掉最后一位呢,因为数字顺序为升序的时候,最右侧的数字是最大的,所以去掉
// ( 第 2 种情况 也无需再单独去判断了,因为内层循环中如果找不到arr[ i ] <= arr[ i + 1 ],退出循环的时候,i 会定位在 倒数第二个元素上面 )// 最右侧的数字相当于 --> 整个高精度正数少了一位 + 少了最大的数、
// 程序过程:
// 1. 最外层循环:用来控制循环次数 --> 循环 k 次 --> 删掉 k 个数字
// 2. 最内层循环:用来寻找 arr[ i ] < arr[ i + 1 ] 的情况,如果遇到,则退出循环,将 i 定位在 5 处( 比如 1 2 3 4 5 1 ),退出循环以后将 5 删除即可//借用的函数:erase(a, b) --> 删除函数 --> STL容器// 高峰期 --> 我的理解就是 从左往右依次两两比较,只要遇到不是 arr[ i ] <= arr[ i + 1 ] 而是 arr[ i ] > arr[ i + 1 ], 则 arr[ i ] 就是这个高峰期
// 简单点说,就是尽可能的让高位数字的顺序为升序 --> 因为 高位数字小, 则整个 高精度数字 就小// 变量:
// arr --> 存放高精度正整数
// k --> 要删除的数字的数量
// i --> 决定 高峰 的位置#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main( void ){string arr; // 表示的 高精度正整数int k; // 表示的 要删除的数字数量cin >> arr >> k;while( k ){// 寻找 高峰期int i;for( i = 0; arr[ i ] <= arr[ i + 1 ] && i < arr.size() - 1; i ++ ); // 非常简洁 --> 寻找 高峰期(第一次知道这个词语,从题解中看到的,因为我自己不知道用什么词语可以表达找到的这个元素)arr.erase( i, 1 ); // 从第 i 个位置连续删 1 个元素k --;}// 处理前导零 --> 如果本来的 高精度正整数 前面几个为0,则不能将其打出来, 应该将它们去掉while( arr [ 0 ] == '0' && arr.size() > 1 ) {//处理前导零, 并且保证如果数字为0,则必须保留一位0 arr.erase( 0, 1 );}cout << arr;return 0;
}

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

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

相关文章

【落羽的落羽 数据结构篇】算法复杂度

文章目录 一、数据结构和算法简介二、算法复杂度1. 时间复杂度2. 空间复杂度 一、数据结构和算法简介 数据结构是计算机存储、组织数据的方式&#xff0c;指相互之间存在一种或多种特定关系的数据元素的集合。没有一种单一的数据结构对所有用途都有用&#xff0c;所以我们要学…

22_解析XML配置文件_List列表

解析XML文件 需要先 1.【加载XML文件】 而 【加载XML】文件有两种方式 【第一种 —— 使用Unity资源系统加载文件】 TextAsset xml Resources.Load<TextAsset>(filePath); XmlDocument doc new XmlDocument(); doc.LoadXml(xml.text); 【第二种 —— 在C#文件IO…

第十五届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组

第十五届的题目在规定时间内做出了前5道&#xff0c;还有2道找时间再磨一磨。现在把做的一些思路总结如下&#xff1a; 题1&#xff1a;握手问题 问题描述 小蓝组织了一场算法交流会议&#xff0c;总共有 50人参加了本次会议。在会议上&#xff0c;大家进行了握手交流。按照惯例…

联想电脑怎么设置u盘启动_联想电脑设置u盘启动方法(支持新旧机型)

有很多网友问联想电脑怎么设置u盘启动&#xff0c;联想电脑设置u盘启动的方法有两种&#xff0c;一是通过bios进行设置。二是通过快捷方式启动进入u盘启动。但需要注意有两种引导模式是&#xff0c;一种是uefi引导&#xff0c;一种是传统的leacy引导&#xff0c;所以需要注意制…

GitHub Actions 使用需谨慎:深度剖析其痛点与替代方案

在持续集成与持续部署&#xff08;CI/CD&#xff09;领域&#xff0c;GitHub Actions 曾是众多开发者的热门选择&#xff0c;但如今&#xff0c;其弊端逐渐显现&#xff0c;让不少人在使用前不得不深思熟虑。 团队由大约 15 名工程师组成&#xff0c;采用基于主干的开发方式&am…

Leetcode-两数相加

给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不会以 0 …

MySQL安装教程

一、下载 点开下面的链接&#xff1a;下载地址 点击Download 就可以下载对应的安装包了, 安装包如下: 二、解压 下载完成后我们得到的是一个压缩包&#xff0c;将其解压&#xff0c;我们就可以得到MySQL 8.0.34 的软件本体了(就是一个文件夹)&#xff0c;我们可以把它放在你想…

BGP分解实验·11——路由聚合与条件性通告(3)

续接上&#xff08;2&#xff09;的实验。其拓扑如下&#xff1a; 路由聚合的负向也就是拆分&#xff0c;在有双出口的情况下&#xff0c;在多出口做流量分担是优选方法之一。 BGP可以根据指定来源而聚合路由&#xff0c;在产生该聚合路由的范围内的条目注入到本地BGP表后再向…

INCOSE需求编写指南-第1部分:介绍

第1部分&#xff1a;介绍Section 1: Introduction 1.1 目的和范围 Purpose and Scope 本指南专门介绍如何在系统工程背景下以文本形式表达需求和要求陈述。其目的是将现有标准&#xff08;如 ISO/IEC/IEEE 29148&#xff09;中的建议以及作者、主要贡献者和审稿员的最佳实践结…

基于神经网络的视频编码NNVC(1):帧内预测

在H.266/VVC发布后&#xff0c;基于传统编码框架提升压缩率越来越难&#xff0c;随着深度学习的发展&#xff0c;研究人员开始尝试将神经网络引入编码器。为此&#xff0c;JVET工作组在2020年成立AHG11小组来专门进行基于神经网络的视频编码的研究。 为了方便研究&#xff0c;工…

深入探究分布式日志系统 Graylog:架构、部署与优化

文章目录 一、Graylog简介二、Graylog原理架构三、日志系统对比四、Graylog部署传统部署MongoDB部署OS或者ES部署Garylog部署容器化部署 五、配置详情六、优化网络和 REST APIMongoDB 七、升级八、监控九、常见问题及处理 一、Graylog简介 Graylog是一个简单易用、功能较全面的…

寒假1.23

题解 web&#xff1a;[极客大挑战 2019]Secret File&#xff08;文件包含漏洞&#xff09; 打开链接是一个普通的文字界面 查看一下源代码 发现一个链接&#xff0c;点进去看看 再点一次看看&#xff0c;没什么用 仔细看&#xff0c;有一个问题&#xff0c;当点击./action.ph…

ORB-SLAM2源码学习:Initializer.cc⑧: Initializer::CheckRT检验三角化结果

前言 ORB-SLAM2源码学习&#xff1a;Initializer.cc⑦: Initializer::Triangulate特征点对的三角化_cv::svd::compute-CSDN博客 经过上面的三角化我们成功得到了三维点&#xff0c;但是经过三角化成功的三维点并不一定是有效的&#xff0c;需要筛选才能作为初始化地图点。 …

微信小程序1.1 微信小程序介绍

1.1 微信小程序介绍 内容提要 1.1 什么是微信小程序 1.2 微信小程序的功能 1.3 微信小程序使用场景 1.4 微信小程序能取代App吗 1.5 微信小程序的发展历程 1.6微信小程序带来的机会

STM32 GPIO配置 点亮LED灯

本次是基于STM32F407ZET6做一个GPIO配置&#xff0c;实现点灯实验。 新建文件 LED.c、LED.h文件&#xff0c;将其封装到Driver文件中。 双击Driver文件将LED.c添加进来 编写头文件&#xff0c;这里注意需要将Driver头文件声明一下。 在LED.c、main.c里面引入头文件LED.h LED初…

vulnhub靶场【kioptrix-3】靶机

前言 靶机&#xff1a;kioptrix-3&#xff0c;IP地址为192.168.1.74 攻击&#xff1a;kali&#xff0c;IP地址为192.168.1.16 都采用虚拟机&#xff0c;网卡为桥接模式 文章中涉及的靶机&#xff0c;来源于vulnhub官网&#xff0c;想要下载&#xff0c;可自行访问官网下载&a…

Cloudflare通过代理服务器绕过 CORS 限制:原理、实现场景解析

第一部分&#xff1a;问题背景 1.1 错误现象复现 // 浏览器控制台报错示例 Access to fetch at https://chat.qwenlm.ai/api/v1/files/ from origin https://ocr.doublefenzhuan.me has been blocked by CORS policy: Response to preflight request doesnt pass access con…

VMware虚拟机安装Linux系统(openKylin)

首先打开VMware Workstation&#xff0c;点击创建新的虚拟机。 进入虚拟机引导界面后&#xff0c;选择“典型”选项&#xff0c;点击下一步&#xff1b; 选择“稍后安装操作系统”&#xff0c;点击下一步&#xff1b; 客户机操作系统选择“Linux”&#xff0c;版本选择Ubuntu 6…

RabbitMQ 多种安装模式

文章目录 前言一、Windows 安装 RabbitMq1、版本关系2、Erlang2.1、下载安装 Erlang 23.12.2、配置 Erlang 环境变量 3、RabbitMQ3.1、下载安装 RabbitMQ 3.8.93.2、环境变量3.3、启动RabbitMQ 管理插件3.3、RabbitMQ3.4、注意事项 二、安装docker1、更新系统包&#xff1a;2、…

【Java-数据结构】Java 链表面试题上 “最后一公里”:解决复杂链表问题的致胜法宝

我的个人主页 我的专栏&#xff1a;Java-数据结构&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;点赞❤ 收藏❤ 引言&#xff1a; Java链表&#xff0c;看似简单的链式结构&#xff0c;却蕴含着诸多有趣的特性与奥秘&#xff0c;等待我们去挖掘。它就像一…