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));
}
}
}
}
}
}