1. 程式人生 > >Day1:會場安排問題

Day1:會場安排問題

問題描述:

假設要在足夠多的會場裡安排一批活動,並希望用盡可能少的會場,設計一個有效的演算法進行安排。

演算法設計:

對於給定的ķ個待安排活動,計算使用最少會場的時間表。

輸入輸出:

輸入輸出:

5 3

1 23

12 28

25 35

27 80

36 50

 


思路:

還是0表示開始1表示結束

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表示結束時間 
}

輸出結果: