贪心算法——1321:【例6.3】删数问题(Noip1994)

在这里插入图片描述

自己写的,没通过

#include<bits/stdc++.h>
using namespace std;

int main(){
	char n[250],no[250],t[250],temp[250];
	int wz[250],flag;
	int s,g=0;
	cin>>n>>s;
	/* 
	if(strlen(n)<=s){	//如果输入的位数小于要删除的位数 
		cout<<'0';
		return 0;
	}
	*/
	for(int i=0;i<s;i++)	       //记录前s个值和下标 
	{
		t[i]=n[i];
		no[i]=i;
	}
	int i,m;	//m记录前t[]数组前m位不变了 
	for(i=s;i<strlen(n);i++){
		char min='a';				//min值为97 
		int wz;
		for(int j=m;j<s;j++){		//分别进行判断  
			if(t[j]<min){
				min=t[j];
				wz=j;				//记住最小值位置 
			}
		}
		if(n[i]<min){				//如果数组t里的所有值都比之后一个数大则结束循环 
			 break;
		}
		else{
			//cout<<t[wz];			//直接输出最小值
			if(t[m]!=min)m++;		//如果t[m]不等于最小值,则t[m]的值就不变了 
			temp[g++]=t[wz];		//记录结果 
			for(int j=wz;j<s-1;j++){ //将t[wz]后的值向前移一位 
				t[j]=t[j+1];
				no[j]=no[j+1];
			}
			t[s-1]=n[i];			//将n[i]放到t[s-1]位,即最后一位 
			no[s-1]=i;
		}
	} 
	for(int k=i;k<strlen(n);k++) temp[g++]=n[k];	//余下的位数直接加到temp数组后面 
	int d=0,b=0; //b用于记录前置0位置 
	while(true){				//去掉可能存在的前置0 
		if(temp[d++]=='0')b++;
		else break;
	}
	for(int l=b;l<g;l++) cout<<temp[l];				//输出结果 
	if(b>=g)cout<<'0';					//如果b大于等于temp数组长度,则说明结果为0 
	return 0;
}

思路:
从前往后找(st,s+i),找到最小的直接输出
st默认为第一个数,后面为前面最小之后的一个数
i的范围为需要最后输出结果的位数
需要考虑前置0的情况

#include<bits/stdc++.h>
using namespace std;

int main(){
	char t[241];
	int  tt[241],s;
	cin>>t>>s;
	int len=strlen(t);
	for(int i=1;i<=len;i++){
		tt[i]=t[i-1]-'0';	//将字符转化为数字 
	}
	bool f=0;	//将f设为false 
	int mi,st=1; 
	for(int i=1;i<=len-s;i++){	//找len-s位 
		mi=10;	//将m设为一个足够大的数,只要比9大都行
		for(int j=st;j<=s+i;j++){ //找最小的 
			if(mi>tt[j]){ 
				mi=tt[j];
				st=j+1; 
			}
		} 
		if(f||mi){		
		//如果f为true或者mi非0(一开始f为false,用于消去前置0)
			if(mi) f=1;	//如果mi非0,将f设为true,用于输出后面的0 
			cout<<mi; 
		}
	} 
	if(!f) cout<<0; //如果f为flase,说明没有结果 
	return 0;
}

https://www.cnblogs.com/sxrekord/p/deletion_problem.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值