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

ops/2025/3/4 22:07:41/

这道题可以使用贪心算法来解决,核心思路是尽量让高位的数字尽可能小。当我们逐步删除数字时,会优先删除高位中相对较大的数字。具体做法是从左到右遍历数字序列,当发现当前数字比它后面的数字大时,就删除当前数字,直到删除了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.ppmy.cn/ops/163138.html

相关文章

如何防止Python网络爬虫爬取网站内容

要防止Python网络爬虫爬取网站内容&#xff0c;可以从以下几个方面入手&#xff1a; 遵守Robots.txt文件&#xff1a;首先&#xff0c;网站管理员可以通过robots.txt文件明确告知爬虫哪些页面可以抓取&#xff0c;哪些不可以。爬虫在抓取之前应先检查该文件&#xff0c;尊重网站…

图论-腐烂的橘子

994.腐烂的橘子 在给定的 m x n 网格 grid 中&#xff0c;每个单元格可以有以下三个值之一&#xff1a;值 0 代表空单元格&#xff1b; 值 1 代表新鲜橘子&#xff1b; 值 2 代表腐烂的橘子。 每分钟&#xff0c;腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。返回 直到…

RA-Eco-RA2L1-48PIN-V1.0开发板RTC时钟

前言 本文将详细介绍如何在e2studio开发环境中为RA2L1&#xff08;48引脚版本&#xff09;配置RTC&#xff08;Real-Time Clock&#xff0c;实时时钟&#xff09;模块&#xff0c;设置时钟日历&#xff0c;并通过1秒周期中断触发串口打印当前时间。这对于需要实时时间显示的应…

游戏引擎学习第128天

开始 然而&#xff0c;我们仍然有一些工作要做&#xff0c;渲染部分并没有完全完成。虽然现在已经能够运行游戏&#xff0c;而且帧率已经可以接受&#xff0c;但仍然有一些东西需要进一步完善。正在使用调试构建编译版本&#xff0c;虽然调试版本的性能不如优化版本&#xff0…

爬虫基础:一文掌握网页基础和爬虫原理

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、网页基础1.1 网页的基本概念1.2 请求与响应1.3 HTTP 协议1.4 HTTP 状态码1.5 动态网页与静态网页二、 网页的基本结构2.1 HTML(超文本标记语言)2.2 CSS(层叠样式表)2.3 JavaScript三. 爬虫的基本原理四、网页数…

k8s面试题总结(八)

1.K8s部署服务的时候&#xff0c;pod一直处于pending状态&#xff0c;无法部署&#xff0c;说明可能的原因 Node节点的资源不足&#xff0c;yaml文件资源限制中分配的内存&#xff0c;cpu资源太大&#xff0c;node宿主机资源没那么大&#xff0c;导致无法部署。部署pod的yaml文…

力扣 最长回文子串

双指针&#xff0c;多维动态规划。 题目 回文即顺着读跟倒着读都是一样的&#xff0c;然后又是一个找子串的问题&#xff0c;不难发现又是一道dp了。但是&#xff0c;这里维护的状态用到了双指针&#xff0c;找的分别是子串的首字母跟尾字母&#xff0c;因此也是个多维动态规划…

ArcGIS Pro实战技巧:灵活运用线条精准分割与裁切面要素

在地理信息系统&#xff08;GIS&#xff09;的应用中&#xff0c;我们经常需要对地图上的面要素进行精确的分割或裁切。 ArcGIS Pro作为一款强大的GIS软件&#xff0c;提供了多种工具来满足这一需求。 本文将详细介绍如何在ArcGIS Pro中使用线要素对面要素进行分割和裁切&…