luogu P1106 删数问题

题目大意

从一个 N N N 位数里删去 k k k 个数码,使得剩下的数码组成的数最小。

解题思路

注意到 N ≤ 250 N≤250 N250,不难想到贪心:
每次删去一个数码,使得剩下的数最小。
即:使删去 k k k 个数码后的数最小的数是删去 k − 1 k-1 k1 个数码以后的最小的数再删去一个数码得到。

一种错误的思路:每次删去最大的数码。如果有相同数码,删去靠前的。反例: 102 , k = 1 102, k=1 102,k=1

#include <cstdio>
#include <cstdlib>
#include <cstring>

const int MAXN=250;
int n, k;
char str[MAXN+10];

struct node{
	int a[MAXN+10];
	int len;
	node(){
		memset (a, 0, sizeof (a));
		len=0;
	}
	node del (int lc){
		node ans; ans.len=len-1;
		int now=len-1;
		for (int i=len; i>=1; --i){
			if (i==lc) continue;
			ans.a[now]=a[i];
			--now;
		}
		return ans;
	}
	void print (){
		int tf=0;
		for (int i=len; i>=1; --i){
			if (a[i]) tf=1;
			if (tf) printf ("%d", a[i]);
		}
		if (!tf) printf ("0");
	}
}now, tmp, mn;
int operator< (node a, node b){
	if (a.len!=b.len) return a.len<b.len?1:0;
	for (int i=a.len; i>=1; --i)
		if (a.a[i]!=b.a[i])
			return a.a[i]<b.a[i]?1:0;
	return 0;
}
int main(){
	scanf ("%s", str+1); scanf("%d", &k);
	now.len=strlen (str+1);
	for (int i=now.len; i>=1; --i)
		now.a[i]=str[now.len-i+1]-'0';
	for (int i=1; i<=k; ++i){
		for (int j=1; j<=now.len; ++j){
			tmp=now.del (j);
			if (1==j) mn=tmp;
			else if (1!=j&&tmp<mn) mn=tmp;
		}
		now=mn;
	}
	now.print ();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值