删数问题题目
将一定长度的数不断抽取其中的数,是剩下的数保持原次序的基础上最小。
输入
n
n
n(长度不超过240)与
k
k
k(删除次数,不会超过
n
n
n的长度)
关于我的思考与解题流程
一开始我试图用暴力递归,每一层选取最佳删除数,但是觉得太麻烦了,而且并不能体现出算法的效率。
所以我的最后解题思路是在删除次数用完之前使原序列尽可能保持单调递增,可以用数组模拟队列或栈来实现,如果保持了单调递减,还有剩余删除机会,就可以从尾到头一直删除。
为什么要保持单调递增
一句话概括就是保持高位数字最小!
C语言参考代码
#include <stdio.h>
#include <string.h>
char s[300];
char que[300];
int del;
int main()
{
scanf("%s",s);
scanf("%d",&del);
int hh = -1,tt = 0;
for(int i = 0;s[i];i ++)
{
while(del && hh >= tt && s[i]<que[hh]) {del--;hh --;}
que[++ hh] = s[i];
}
while(del --) hh --;
for(int i = 0;i <= hh;i ++) printf("%c",que[i]);
return 0;
}
总结
如果完全只是考虑到局部贪心达到最优解,很容易让自己首先想到遍历选择最优,从而过于降低自己的代码效率了。还是应该将问题剖析后从全局开始思考要求的输出条件。