1. 程式人生 > >貪心演算法(二)

貪心演算法(二)

1.刪除數字求最小值

給定一個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;

public class removenumbits {

    public static int rnb(int a,int k){

     StringBuffer st=new StringBuffer(a+""

);

     int i,j = 0;

     for(i=0;i<k;i++){

     for(j=0;j<st.length()-1&&st.charAt(j)<=st.charAt(j+1);j++) {

     }

     st.deleteCharAt(j);

     }

     return st.length()==0?0:Integer.parseInt(st.toString());

    }

public static void main(String[] args) {

removenumbits

re=new removenumbits();

Scanner s=new Scanner(System.in);

System.out.print("輸入一個數為:");

int a=s.nextInt();

System.out.println("給定去掉的數的個數:");

int k=s.nextInt();

int min=re.rnb(a, k);

System.out.print("刪掉"+k+"個數後得到最小的數為:");

System.out.println(min);

}

}

截圖:

3.設有n個顧客同時等待一項服務。顧客i需要的服務時間為Ti(1<=i<=n)。共有s處提供服務。應如何安排n個顧客的服務次序才能使平均等待時間達到最小?平均等待時間是n個顧客等待服務時間的總和除以n。

  程式碼:

       import java.util.Scanner;

public class Servetime {

 private int time;

 private int number;

double greed(Servetime x[],int s,int n){

      int st[]=new int[s];

      int su[]=new int[s];

      int i=0,j=0;

      while(i<n){

      st[j]+=x[i].time;

      System.out.print(x[i].number+" ");

      su[j]+=st[j];

      ++i;

      ++j;

      if(j==s)j=0;

      }

      double t=0;

      for(i=0;i<s;i++)

      t+=su[i];

      t/=n;

      System.out.println("最小的平均等待時間為:"+t);

      return t;

     }

void sort(Servetime x[],int n){

for(int i=0;i<n;i++){

for(int j=0;j<n-i-1;j++){

if(x[j].time>x[j+1].time){

int t;

t=x[j].number;

x[j].number=x[j+1].number;

x[j+1].number=t;

t=x[j].time;

x[j].time=x[j+1].time;

x[j+1].time=t;

}

}

}

}

public static void main(String[] args) {

Scanner sc=new Scanner(System.in);

int n=0;

n=sc.nextInt();

Servetime [] x=new Servetime[n];

int s;

s=sc.nextInt();

for(int i=0;i<n;i++){

x[i]=new Servetime();

}

for(int i=0;i<n;i++){

  x[i].number=sc.nextInt();

  x[i].time=sc.nextInt();

}

Servetime se=new Servetime();

se.sort(x, n);

System.out.println("最優服務次序為:");

se.greed(x, s, n);

}

}

截圖: