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 次。
具体思路如下:
- 循环 k 次:每次删除一个数字,目标是让剩下的数最小。
- 寻找删除位置 :从左到右扫描数字串,找到第一个满足
n[j] > n[j+1]的位置 j(即"下降点")。这个位置上的数字比它右边的数字大,删除它可以减小高位数值。如果整个序列是非递减的(即没有下降点),则删除最后一个数字。 - 删除操作 :用
erase(p,1)删除找到的位置 p 上的字符。 - 去除前导零:删除完成后,如果结果字符串长度大于1且开头是 '0',则循环删除开头的零。
- 输出结果:输出剩余字符串(若全为零则输出一个"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))。 - 处理流程 :
- 重复 k 次删除操作,每次找到第一个"左边>右边"的位置并删除该左边数字;若无下降点则删除末尾数字。
- 删除完成后,去掉所有前导零(但若全部为零则保留一个"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;
}