标签:strong string color ++ ret 相等 删除对象 false void
原创
给定一个n位正整数a, 去掉其中k个数字后按原左右次序将组成一个新的正整数。对给定的a, k寻找一种方案,使得剩下的数字组成的新数最小。
提示:应用贪心算法设计求解
操作对象为n位正整数,有可能超过整数的范围,存储在数组a中,数组中每一个数组元素对应整数的一位数字。
在整数的位数固定的前提下,让高位的数字尽量小,整数的值就小。这就是所要选取的贪心策略。
每次删除一个数字,选择一个使剩下的数最小的数字作为删除对象。
当k=1时,对于n位数构成的数删除哪一位,使得剩下的数据最小。删除满足如下条件的a[i]:它是第一个a[i]>a[i+1]的数,如果不存在则删除a[n]。
当k>1(当然小于n),按上述操作一个一个删除。每删除一个数字后,后面的数字向前移位。删除一个达到最小后,再从头即从串首开始,删除第2个,依此分解为k次完成。
若删除不到k个后已无左边大于右边的降序或相等,则停止删除操作,打印剩下串的左边n?k个数字即可(相当于删除了若干个最右边的数字)。
import java.util.Scanner; class decK{ private int n; private int num[]; public decK(int n,int k,int num[]){ this.n=n; this.num=num; int k_=n-k; while(k>=1){ boolean flag=false; for(int i=1;i<n;i++){ if(num[i]!=-1){ if(num[i]>num[i+1]){ num[i]=-1; k--; flag=true; break; } } } if(flag==false && k>=1){ //no found num[i]>num[i+1] for(int i=1;i<=n;i++){ if(num[i]!=-1){ System.out.print(num[i]+" "); k_--; if(k_==0){ break; } } } return; } } if(k==0){ for(int i=1;i<=n;i++){ if(num[i]!=-1){ System.out.print(num[i]+" "); } } } } } public class subK { public static void main(String[] args) { Scanner reader=new Scanner(System.in); System.out.print("n:"); int n=reader.nextInt(); System.out.print("k:"); int k=reader.nextInt(); int num[]=new int[n+1]; System.out.print(n+" num:"); for(int i=1;i<=n;i++){ num[i]=reader.nextInt(); } decK dk=new decK(n,k,num); } }
22:38:28
2018-11-04
标签:strong string color ++ ret 相等 删除对象 false void
原文地址:https://www.cnblogs.com/chiweiming/p/9906342.html