Day1:會場安排問題
阿新 • • 發佈:2018-11-02
問題描述:
假設要在足夠多的會場裡安排一批活動,並希望用盡可能少的會場,設計一個有效的演算法進行安排。
演算法設計:
對於給定的ķ個待安排活動,計算使用最少會場的時間表。
輸入輸出:
輸入輸出:
5 3
1 23
12 28
25 35
27 80
36 50
思路:
還是0表示開始1表示結束
0 | 1 |
1 | 23 |
0 | 1 |
12 | 28 |
0 | 1 |
25 | 35 |
0 | 1 |
27 | 80 |
0 | 1 |
36 | 50 |
排序過後:
0 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 1 |
1 | 12 | 23 | 25 | 27 | 28 | 35 | 36 | 50 | 80 |
思路:
比如1和12,都為開始時間,1開始了開闢一個會場,12也開始了,但是這時1沒有結束,這就必須再開闢一個會場給12,這時就開闢了兩個會場了,23是結束時間,這個時候不管是1還是12結束,都會釋放一個會場,那麼現在就只有一個會場了,25開始的時候,1和12有一個還沒結束,那麼就要給25開闢一個會場,那麼現在就有兩個會場,以此類推,所需最少會場數,即為開闢會場數的峰值。
程式碼實現:
package aaa; import java.util.Scanner; public class BestLoad { public static void main(String[] args) { Scanner reader=new java.util.Scanner(System.in); int k=0,sum=0,max=0; System.out.println("輸入活動數"); int n=reader.nextInt(); Stu[] s=new Stu[500]; System.out.println("輸入每個活動開始和結束時間"); for(int i=0;i<n;i++) { s[k]=new Stu(); s[k].v=reader.nextInt(); s[k].t=0;////t為值 v為標誌位,0表示開始時間,1表示結束時間 k++; s[k]=new Stu(); s[k].v=reader.nextInt(); s[k].t=1; k++; } //將所有時間排序 for(int i=0;i<n;i++) { for(int j=0;j<n-i;j++) { if(s[i].v>s[i+1].v) { swap(s[i],s[i+1] ); } } } //碰到開始時間sum+1;結束時間sum-1; for(int i=0;i<n;i++) { if (s[i].t==0) { sum++; } else { sum--; } if(sum>max) max=sum; } System.out.println(max); } public static void swap(Stu x,Stu y) { Stu temp; temp=x; x=y; y=temp; } } class Stu { int v,t;//v為值 t為標誌位,0表示開始時間,1表示結束時間 }