贪心系列之删数字

P1106 删数问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

给我们一串数字,要求我们删除n个数使得剩余数字按原顺序组成的数字最小。

我们怎么考虑这个问题,我们知道要使得删除后的数字最小,我们要把握的原则就是优先删除

最高位数字,但这还没完,我们好要保证最高位的数字比它次高位的数字大才行。为什么,

大家想想,如果是13456,我们删除一个数字,肯定会选择删除6来得到最小,如果删除1就大了。

我们怎么考虑这个问题,我们首先从最高位的开始考虑,最高位是1比3小,不行,第三位又比第二位大,一次向后,我们发现最后一位又比前一位大,所以我们只能删除最后一位。

我们再看样例3217我们删除两个数字,3比2大,删除3,2比1大,删除2,剩下17.

因此,我们可以得出结论,我们的步骤就是每次从最高位开始,一次删除比下一个元素大的元素。

为了删除末尾,我们可以添加个-1在末尾。


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Scanner;
import java.util.TreeMap;
import java.util.TreeSet;
public class Main {	
  public static void main(String[] args) throws NumberFormatException, IOException  {
Scanner sc=new Scanner(System.in);
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw=new PrintWriter(System.out);
BigInteger bi1=sc.nextBigInteger();
String aString="";
aString=aString+bi1;
int a=sc.nextInt();
int b=0;
int c=aString.length();
ArrayList<Integer> al1=new ArrayList<>();
for(b=0;b<c;b++) {
	al1.add(aString.charAt(b)-'0');
}
al1.add(-1);
b=0;
int d=0;
int e=al1.size();
while(true) {
	if(b==a) {
		break;
	}
	if(d+1<e) {
		if(al1.get(d)>al1.get(d+1)) {
			al1.remove(d);
			d=0;//删除一位形成新数字,从新数字的第一位开始删除
			b++;
		}
		else {
			d++;
		}
	}
}
if(al1.size()==1) {//如果n个数字删除n位打印0
	System.out.println("0");
}
else if(al1.size()==2&&al1.get(0)==0) {
	System.out.println("0");如果诸如10删除一位的0打印0
}
else {
	int biaoji=0;如果是0001111删除几位数字,我们必须把前置0删除光
	int answer=0;
	for(int i=0;i<al1.size();i++) {
		if(al1.get(i)!=-1) {
			if(al1.get(i)==0&&biaoji==0) {
				continue;
			}
			else {
				biaoji=1;
				System.out.print(al1.get(i));
			}
			
		}
	}
}
	}
	
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值