【蓝桥杯冲冲冲】贪心算法进阶之删数问题

蓝桥杯备赛 | 洛谷做题打卡day17

文章目录

删数问题

题目描述

键盘输入一个高精度的正整数 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

我们的思路是这样的:


  • 要删m个数,一开始m=k,在左边m+1个数中,找到其中最小的数(如果有多个则选最左边的),记它的位置为t,显然,t左边的l个数都可以删掉,此时还需要删m-l个数,m重新赋值为m-l,而t右边的数是一个新的数列,进行同样的操作,直到选出了n-k个数为止。
  • 证明?我们希望从左开始在尽量大的范围内找到一个最小的数作为结果的第一位,但范围不能超过m+1,否则可能把左边全部m个数删了也无法把找到的数作为第一位,第一位找到后是第二位,同理,这很贪心。
  • 这样做可以每找出一个数就直接输出,但还要考虑前导0的问题,若循环结束没有输出(意味着答案是0)就在程序结束前输出0。

* Your Lie in April

题解代码

学会利用新知,自己多试试并尝试积攒一些固定解答方案,debug,以下是题解代码 ~

c++ 复制代码
#include<iostream>
#include<string>
using namespace std;
int n,k,a[257],rest,t=1,minp,cnt=0;
bool flag=0;
string num;
int main(){
    cin>>num>>k;
    n=num.length();
    for(int i=1;i<=n;++i)a[i]=num[i-1]-'0';
    rest=n-k;
    while(cnt<rest){
        minp=t;
        for(int i=t;i<=k+t;++i)if(a[minp]>a[i])minp=i;
        if(a[minp])flag=1;
        if(flag)cout<<a[minp];
        k-=minp-t;
        t=minp+1;
        cnt++;
    }
    if(!flag)cout<<0;
    return 0;
}

我的一些话

  • 今天学习进阶贪心算法,这道题思路很重要。所谓程序,其基本便是数据结构加算法,因此磨刀不误砍柴工,在手敲代码前,自己最好对题目有一个通盘的考虑。但也不要害怕编译失败,多思考思路还是很好掌握的,虽然一次性AC有一定难度,需要通盘的考虑和理解,以及扎实的数据结构基础才能独立写出AC代码。但无论难易,大家都要持续做题,保持题感喔!一起坚持(o´ω`o)

  • 如果有非计算机专业的uu自学的话,关于数据结构的网课推荐看b站上青岛大学王卓老师的课,讲的很细致,有不懂都可以私信我喔

  • 总结来说思路很重要,多想想,多在草稿纸上画画,用测试数据多调试,debug后成功编译并运行出正确结果真的会感到很幸福!

  • 关于之前蓝桥杯备赛的路线和基本方法、要掌握的知识,之前的博文我都有写,欢迎大家关注我,翻阅自取哦~

  • 不管什么都要坚持吧,三天打鱼两天晒网无法形成肌肉记忆和做题思维,该思考的时候一定不要懈怠,今天就说这么多啦,欢迎评论留言,一起成长:)

相关推荐
June bug3 小时前
【软考中级·软件评测师】下午题·面向对象测试之架构考点全析:分层、分布式、微内核与事件驱动
经验分享·分布式·职场和发展·架构·学习方法·测试·软考
薰衣草23338 小时前
一天两道力扣(1)
算法·leetcode·职场和发展
爱coding的橙子9 小时前
每日算法刷题Day41 6.28:leetcode前缀和2道题,用时1h20min(要加快)
算法·leetcode·职场和发展
天真小巫1 天前
2025.6.27总结
职场和发展
Memories off10 天前
实习/秋招记录:软件开发转AI或安全
职场和发展
Alfred king10 天前
面试150跳跃游戏
python·leetcode·游戏·贪心算法
一入JAVA毁终身10 天前
针对我的简历模拟面试
面试·职场和发展
挑战者66688810 天前
如何制定团队制度?
职场和发展·项目管理·创业创新
呆呆的小鳄鱼10 天前
leetcode:746. 使用最小花费爬楼梯
算法·leetcode·职场和发展
minos.cpp10 天前
从厨房到代码台:用做菜思维理解iOS开发 - Swift入门篇①
ios·蓝桥杯·swift