本文主要是介绍算法设计与分析算法实现——删数问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
通过棋盘输入一个高精度的正整数n(n的有效位数<=240)去掉其中任意s个数字后,剩下的数字按原左右次序将组成一个新的正整数。变成对给定的n和s,寻找一种方案,使得剩下的数字组成的新数最小。
输入:n,s
输出:最后剩下的最小数
输入实例:
178543
4
输出示例:
13
首先题目的意思是,在不改变数字原有位置的前提下,删除s个数,使得剩下的数按照原有位置构成的新数字值最小。
那么数组不可进行排序来改变原有序列,易知,想要最后获得的数最小,那么越高位的数(数组下标越小的数)值要越小。
因此从前向后遍历数组,选择一定范围里最小的数,作为最后新数的高位,同时又要使得后面的数位够用。
这个一定的范围就是滑动窗口,滑动窗口的始端可以设置为构成新数上一个高位在原数组的位置的下一个;滑动窗口的末端必须不超过原数组的长度,又要保持原数组后面的位数构成新数够用。
因此两层循环,外层循环控制窗口不会超出原数组;内层循环求窗口内的最值。
//解题思路
//易知,越高位的数越小,则最后得数越小
//顺着数组从前向后滑动窗口,求窗口内的最小值
#include<iostream>
#include<cstdio>
#include<string>
using
这篇关于算法设计与分析算法实现——删数问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!