删数——Edu贪心问题

本文探讨了一种优化算法,用于在有限删除次数内保持数列尽可能单调递增。通过使用模拟队列或栈,优先删除高位较小的数字,以确保序列的全局最优状态。代码示例展示了C语言实现,强调了全局思考和避免局部贪心策略的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

删数问题题目

将一定长度的数不断抽取其中的数,是剩下的数保持原次序的基础上最小。
输入 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;
}

总结

如果完全只是考虑到局部贪心达到最优解,很容易让自己首先想到遍历选择最优,从而过于降低自己的代码效率了。还是应该将问题剖析后从全局开始思考要求的输出条件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值