zoukankan      html  css  js  c++  java
  • 删除一个数的K位使原数变得最小

    原创


    给定一个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

  • 相关阅读:
    POJ3094 UVALive3594 HDU2734 ZOJ2812 Quicksum【进制】
    UVALive5583 UVA562 Dividing coins
    POJ1979 HDU1312 Red and Black【DFS】
    POJ1979 HDU1312 Red and Black【DFS】
    POJ2386 Lake Counting【DFS】
    POJ2386 Lake Counting【DFS】
    HDU4394 Digital Square
    HDU4394 Digital Square
    UVA213 UVALive5152 Message Decoding
    UVA213 UVALive5152 Message Decoding
  • 原文地址:https://www.cnblogs.com/chiweiming/p/9906342.html
Copyright © 2011-2022 走看看