csp信奥赛C++高频考点专项训练之贪心算法 --【删数问题】:删数问题

csp信奥赛C++高频考点专项训练之贪心算法 --【删数问题】:删数问题

题目描述

键盘输入一个高精度的正整数 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 1≤k<len(n)≤250。

注意:去掉若干数字后剩下的数可以存在前导零,而输出时不要输出前导零。

思路分析

直接贪心删除 策略:每次删除一个数字,重复 k 次。

具体思路如下:

  1. 循环 k 次:每次删除一个数字,目标是让剩下的数最小。
  2. 寻找删除位置 :从左到右扫描数字串,找到第一个满足 n[j] > n[j+1] 的位置 j(即"下降点")。这个位置上的数字比它右边的数字大,删除它可以减小高位数值。如果整个序列是非递减的(即没有下降点),则删除最后一个数字。
  3. 删除操作 :用 erase(p,1) 删除找到的位置 p 上的字符。
  4. 去除前导零:删除完成后,如果结果字符串长度大于1且开头是 '0',则循环删除开头的零。
  5. 输出结果:输出剩余字符串(若全为零则输出一个"0")。

代码实现

cpp 复制代码
#include<bits/stdc++.h> // 万能头文件
using namespace std;
string n; // 存储输入的高精度数字
int k;    // 需要删除的数字个数
int main(){
    cin>>n>>k; // 读入数字串和k
    for(int i=1;i<=k;i++){ // 重复删除k次
        int p=n.size()-1; // 默认删除最后一个字符(当序列非递减时)
        for(int j=0;j<=n.size()-2;j++){ // 从左到右扫描相邻两位
            if(n[j]>n[j+1]){ // 找到第一个下降点(左边大于右边)
                p=j;         // 记录要删除的位置
                break;       // 立即退出扫描
            }
        }
        n.erase(p,1); // 删除该位置的一个字符
    }
    // 去除前导零,但至少保留一个数字(防止全删后为空)
    while(n.size()>1 && n[0]=='0'){
        n.erase(0,1); // 删除开头的'0'
    }
    cout<<n<<endl; // 输出结果
    return 0;
}

功能分析

  • 输入 :高精度正整数 n(字符串形式,长度≤250)和正整数 k(k < len(n))。
  • 处理流程
    1. 重复 k 次删除操作,每次找到第一个"左边>右边"的位置并删除该左边数字;若无下降点则删除末尾数字。
    2. 删除完成后,去掉所有前导零(但若全部为零则保留一个"0")。
  • 输出:删除 k 个数字后能得到的最小数字(无前导零)。
  • 正确性:基于贪心原理------每次删除第一个下降点能保证当前步最优,最终结果全局最优。
  • 时间复杂度:O(k·len),在题目限制下(len≤250)完全可接受。
  • 空间复杂度:O(len),仅使用原字符串和几个变量。

各种学习资料,助力大家一站式学习和提升!!!

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
	cout<<"##########  一站式掌握信奥赛知识!  ##########";
	cout<<"#############  冲刺信奥赛拿奖!  #############";
	cout<<"######  课程购买后永久学习,不受限制!   ######";
	return 0;
}

【秘籍汇总】(完整csp信奥赛C++学习资料):

1、csp/信奥赛C++,完整信奥赛系列课程(永久学习):

https://edu.csdn.net/lecturer/7901 点击跳转

2、CSP信奥赛C++竞赛拿奖视频课:

https://edu.csdn.net/course/detail/40437 点击跳转

https://edu.csdn.net/course/detail/41081 点击跳转

3、csp信奥赛高频考点知识详解及案例实践:

CSP信奥赛C++动态规划:
https://blog.csdn.net/weixin_66461496/category_13096895.html点击跳转

CSP信奥赛C++标准模板库STL:
https://blog.csdn.net/weixin_66461496/category_13108077.html 点击跳转

信奥赛C++提高组csp-s知识详解及案例实践:
https://blog.csdn.net/weixin_66461496/category_13113932.html 点击跳转

4、csp信奥赛冲刺一等奖有效刷题题解:

CSP信奥赛C++初赛及复赛高频考点真题解析(持续更新): https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转

信奥赛C++提高组csp-s初赛&复赛真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13125089.html 点击跳转

5、GESP C++考级真题题解:

GESP(C++ 一级+二级+三级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12858102.html 点击跳转

GESP(C++ 四级+五级+六级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12869848.html 点击跳转

GESP(C++ 七级+八级)真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13117178.html 点击跳转

· 文末祝福 ·

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
	cout<<"跟着王老师一起学习信奥赛C++";
	cout<<"    成就更好的自己!       ";
	cout<<"  csp信奥赛一等奖属于你!   ";
	return 0;
}
相关推荐
geneculture2 小时前
本真信息观:基于序位守恒的融智学理论框架——人类认知第二次大飞跃的基础
人工智能·算法·机器学习·数据挖掘·融智学的重要应用·哲学与科学统一性·融智时代(杂志)
kronos.荒2 小时前
动态规划——最长递增子序列系列问题(python)
算法·动态规划·最长递增子序列系列问题
qq_254617772 小时前
attribute((constructor)) 在C/C++中的应用
开发语言·c++
云深麋鹿2 小时前
C++ | 多态
开发语言·c++
生信研究猿2 小时前
#P4625.第2题-大模型训练显存优化算法
算法
逻辑驱动的ken2 小时前
Java高频面试考点14
开发语言·数据库·算法·哈希算法
故事还在继续吗2 小时前
C++17关键特性
开发语言·c++·算法
Rabitebla2 小时前
【数据结构】消失的数字+ 轮转数组:踩坑详解
c语言·数据结构·c++·算法·leetcode
菜菜的顾清寒2 小时前
力扣100(20)旋转图像
算法·leetcode·职场和发展