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

这道题可以使用贪心算法来解决,核心思路是尽量让高位的数字尽可能小。当我们逐步删除数字时,会优先删除高位中相对较大的数字。具体做法是从左到右遍历数字序列,当发现当前数字比它后面的数字大时,就删除当前数字,直到删除了S个数字或者遍历完整个序列。如果遍历完后删除的数字个数还不够S个,就从序列的末尾继续删除。
在这里插入图片描述

【算法思路】

  1. 输入处理:使用 string 类型存储高精度的正整数 num,并读取要删除的数字个数 s

这道题为什么用字符串存储而不是数组存储?

处理大整数的便利性:题目中明确提到输入的是一个高精度的正整数,且不超过 250 位。普通的整数类型(如 intlong long)所能表示的数值范围是有限的,无法存储如此大的数字。字符串可以轻松地存储任意长度的数字序列,它本质上是字符数组,每个字符对应数字的一位,不受数值范围的限制。例如,对于一个 200 位的大整数,使用字符串可以直接将其按位存储,不会出现溢出问题。

操作的灵活性:在本题中,需要进行删除数字的操作。字符串提供了方便的方法来删除指定位置的字符,例如在 C++ 中可以使用 erase 函数。对于字符串 str,可以使用 str.erase(i, 1) 轻松删除第 i 个位置的字符。

//数组存储
vector<int> num(n);
int k;
for(int i=0;i<n;i++){cin>>num[i];
}
cin>>k;//字符串存储
string num;
int k;
cin>>num>>k;
  1. 删数操作
  • 进入一个循环,循环次数为 k 次。
  • 在每次循环中,从左到右遍历 num,找到第一个满足 num[i] > num[i + 1] 的位置 i,然后删除该位置的数字。
  • 如果内层循环结束后 deleted 仍然为 false,说明在当前数字字符串中没有找到递减的位置,此时使用 num.erase(num.length() - 1, 1) 删除字符串的最后一个字符,并将 k 减 1。
  1. 去除前导零:删数操作完成后,可能会出现前导零的情况,因此需要去除前导零。

    • 定义int类型的变量start变量初始化为0,用于记录数字字符串中第一个非零字符的位置。
    • 进入 while (start < num.length() && num[start] == '0') 循环,从字符串的开头开始遍历,只要没有遍历到字符串末尾且当前字符是0,就将start加1。
    • 用三目运算符处理前导零并且给num赋予合适的值。
  2. 输出结果:如果去除前导零后 num 为空,说明最终结果为 0,输出 0;否则输出 num

【代码示例】

#include<iostream>
#include<string>
using namespace std;int main(){string num;int k;cin>>num>>k;//进行k次删除操作 while(k > 0){bool deleted=false;//标记是否找到递减位置 for(int i=0;i < num.length()-1;++i){if(num[i] > num[i+1]){//找到第一个递减的位置,删除改位置的数字num.erase(i,1);deleted=true;k--;break;}}//如果没找到递减位置,删除末尾字符 if(!deleted){num.erase(num.length() - 1,1); k--;}}//去除前导零int start=0;while (start < num.length() && num[start] == '0'){start++;}num = (start==num.length()) ? "0" : num.substr(start);cout<<num<<endl; return 0;
}

注意:

  • 边界处理:若序列完全递增,删除末尾数字

  • substr:是 std::string 类的一个成员函数,num.substr(start) 会返回从字符串 num 的第 start 个位置开始一直到字符串末尾的子字符串。

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

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

相关文章

【springboot】Spring 官方抛弃了 Java 8!新idea如何创建java8项目

解决idea至少创建jdk17项目 问题 idea现在只能创建最少jdk17&#xff0c;不能创建java8了吗?解决 问题 idea现在只能创建最少jdk17&#xff0c;不能创建java8了吗 我本来以为是 IDEA 版本更新导致的 Bug&#xff0c;开始还没在意。 直到我今天自己初始化项目时才发现&am…

MyBatis 操作数据库(详细入门详细)

本章⽬标 1. 使⽤MyBatis完成简单的增删改查操作, 参数传递. 2. 掌握MyBatis的两种写法: 注解 和 XML⽅式 3. 掌握MyBatis 相关的⽇志配置 铺垫 在应⽤分层学习时, 我们了解到web应⽤程序⼀般分为三层&#xff0c;即&#xff1a;Controller、Service、Dao . 之前的案例中…

C# 基于.NET Framework框架WPF应用程序-MQTTNet库实现MQTT消息订阅发布

C# 基于.NET Framework框架WPF应用程序-MQTTNet库实现MQTT消息订阅发布 MQTT简述MQTTNet简述创建项目&#xff08;基于.NET Framework框架&#xff09;安装MQTTNet库项目源码运行效果 MQTT简述 mqtt官网 MQTTNet简述 MQTTnet MQTTnet 是一个强大的开源 MQTT 客户端库&#…

武汉大学生命科学学院与谱度众合(武汉)生命科技有限公司举行校企联培座谈会

2025年2月21日下午&#xff0c;武汉大学生命科学学院与谱度众合&#xff08;武汉&#xff09;生命科技有限公司&#xff08;以下简称“谱度众合”&#xff09;在学院学术厅举行校企联培专业学位研究生合作交流会。武汉大学生命科学学院副院长刘星教授、生命科学学院周宇教授、产…

【JSON2WEB】15 银河麒麟操作系统下部署JSON2WEB

【JSON2WEB】系列目录 【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 【JSON2WEB】06 JSO…

Redis 持久化方式:RDB(Redis Database)和 AOF(Append Only File)

本部分内容是关于博主在学习 Redis 时关于持久化部分的记录&#xff0c;介绍了 RDB 和 AOF 两种持久化方式&#xff0c;详细介绍了持久化的原理、配置、使用方式、优缺点和使用场景。并对两种持久化方式做了对比。文章最后介绍了 Redis 持久化的意义并与其他常见的缓存技术做了…

华为云之使用鲲鹏弹性云服务器部署Node.js环境【玩转华为云】

华为云之使用鲲鹏弹性云服务器部署Node.js环境【玩转华为云】 一、本次实践介绍1.1 实践环境简介1.3 本次实践完成目标 二、 相关服务介绍2.1 华为云ECS云服务器介绍2.2 Node.js介绍 三、环境准备工作3.1 预置实验环境3.2 查看预置环境信息 四、登录华为云4.1 登录华为云4.2 查…

《Python实战进阶》No 7: 一个AI大模型聊天室的构建-基于WebSocket 实时通信开发实战

第7集&#xff1a; 一个AI大模型聊天室的构建-基于WebSocket 实时通信开发实战 在现代 Web 开发中&#xff0c;实时通信已经成为许多应用的核心需求。无论是聊天应用、股票行情推送&#xff0c;还是多人协作工具&#xff0c;WebSocket 都是实现高效实时通信的最佳选择之一。本…

(转)Java单例模式(1)

l单例模式的好多&#xff1a;节约了内存&#xff0c;提高了代码的执行效率。

【PCIe 总线及设备入门学习专栏 1.2 -- 访问 PCIe 设备过程】

文章目录 OverviewPCIe 系统软件层次TLP 通用格式配置过程PCIe 设备配置寄存器Type0 Configuration Request配置过程Overview 对于PCIe 设备来说,它与桥的连接直通过两条差分信号,那么当桥下面接入多个PCIe 设备时,它是如何选中某个设备的呢?我面前面一篇文件介绍了 PCI设…

HarmonyOS NEXT组件深度全解:十大核心组件开发指南与实战

文章目录 引言&#xff1a;组件化开发的未来趋势第一章&#xff1a;基础UI组件精要1.1 Button&#xff1a;交互设计的基石1.1.1 多态按钮实现1.1.2 高级特性 1.2 Text&#xff1a;文字渲染的进阶技巧1.2.1 富文本混排1.2.2 性能优化 第二章&#xff1a;布局组件深度解析2.1 Fle…

win11编译pytorch cuda128版本流程

Geforce 50xx系显卡最低支持cuda128&#xff0c;torch cu128 release版本目前还没有释放&#xff0c;所以自己基于2.6.0源码自己编译wheel包。 1. 前置条件 1. 使用visual studio installer 安装visual studio 2022&#xff0c;工作负荷选择【使用c的桌面开发】,安装完成后将…

log4j2中<logger>中没有指定appender的输出

一 优先级 1.1 规则 1.如果一个 <logger> 没有显式配置 appender&#xff0c;Log4j2 会将该日志事件传递给其 父 Logger 的 appender。 2.这种传递行为会一直向上追溯&#xff0c;直到找到配置了 appender 的 Logger&#xff0c;或者到达 Root Logger。 3.如果日志事…

【MySQL】(1) 数据库基础

一、什么是数据库 数据库自行选择了合适的数据结构来组织数据&#xff0c;方便用户写入&#xff08;存储介质&#xff0c;如硬盘&#xff0c;机器断电不会丢失数据&#xff09;和查询数据。在数据结构部分&#xff0c;我们讲到的 ArrayList、HashMap 集合类对象也能存储数据&am…

基于Spring Boot的产业园区智慧公寓管理系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

nginx+keepalived负载均衡及高可用

1 项目背景 keepalived除了能够管理LVS软件外&#xff0c;还可以作为其他服务的高可用解决方案软件。采用nginxkeepalived&#xff0c;它是一个高性能的服务器高可用或者热备解决方案&#xff0c;Keepalived主要来防止服务器单点故障的发生问题&#xff0c;可以通过其与Nginx的…

LeapVAD:通过认知感知和 Dual-Process 思维实现自动驾驶的飞跃

25年1月来自浙江大学、上海AI实验室、慕尼黑工大、同济大学和中科大的论文“LeapVAD: A Leap in Autonomous Driving via Cognitive Perception and Dual-Process Thinking”。 尽管自动驾驶技术取得长足进步&#xff0c;但由于推理能力有限&#xff0c;数据驱动方法仍然难以应…

STM32G431RBT6——(2)浅析Cortex-M4内核

本篇博客是一个对Cortex-M4内核了解性的简介&#xff0c;不会涉及到深奥的理论&#xff0c;请大家放心食用。 我们所学习的STM32G431RBT6单片机是基于ARM的Cotex-M4内核&#xff0c;因此我们有必要对此内核做一个大概了解。其实M4内核和M3内核有很大的相似之处&#xff0c;很多…

python-leetcode-删除并获得点数

740. 删除并获得点数 - 力扣&#xff08;LeetCode&#xff09; 解法 1&#xff1a;动态规划&#xff08;O(n) 时间&#xff0c;O(n) 空间&#xff09; class Solution:def deleteAndEarn(self, nums: List[int]) -> int:if not nums:return 0# 统计每个数的贡献points Cou…

【北京迅为】iTOP-RK3568OpenHarmony系统南向驱动开发-第4章 UART基础知识

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…