会场安排问题(算法实现题4-1)

会场安排问题:做完之后发现答案很简单,很气,但还是把自己写的贴上来。

#include<iostream>
#include<algorithm>
using namespace std;

void Put(int n,int start[],int end[],int mark[],int space[]){

	for(int i=0;i<n;i++)
	{
		space[i] = 0;	
		mark[i] = 0;
	}

	int count=0;  

			for( int i=0;i<n;i++){
				cout<<"count= "<<count<<endl;
				cout<<"会场当前结束时间:	"; 
				
				for(int k=0;k<=count;k++)
					cout<<space[k]<<" ";
							
				sort(space,space+count+1);
				
				cout<<"\n会场当前结束时间排序后:	"; 				
				for(int k=0;k<=count;k++)
					cout<<space[k]<<" ";
				cout<<endl;
				
				for(int j=0;j<=count;j++){
					if(start[i] > space[j]){
						mark[i] = 1;
						space[j] = end[i];
						cout<<"end["<<i<<"] = "<<end[i]<<"	space[ "<<j<<"]= "<<space[j]<<endl; 
						break;
					}
							
				}
					if(mark[i] !=1) {
						count++;
						space[count] = end[i];
						cout<<"end["<<i<<"] = "<<end[i]<<"	space[ "<<count<<"]= "<<" "<<space[count]<<endl; 
						
					}		
			}		

	cout<<"使用会场的个数:"<<count+1<<endl;
	
	cout<<"会场最后结束时间:"; 
	for(int i=0;i<=count;i++)
		cout<<space[i]<<"	";
}

int main(){
	int n=5;
	int start[5] = {1,12,25,27,36};
	int end[5] = {23,28,35,80,50};
	int mark[n];
	int space[n];
	
	Put(n,start,end,mark,space);
	
	return 0;
}


具体的算法是:看一活动的开始时间是否大于某一会场的结束时间,如果是就加入该会场中,并更新该会场的结束时间,(如果有多个会场选择的话,就选最优的那一个,即结束时间最小的),如果所有的会场都不满足,则再新增一个会场,把该活动的结束时间赋予这个新增的会场。

算法的时间复杂度: 设有 n 个活动,使用了k(k<=n)个会场,则时间复杂度为 O(n(k+nlogn))

贴一下习题解答的代码:

int greedy(vector<point>x){
	int sum = 0,curr = 0,n = x.size();
	sort(x.begin(),x.end());
	for(int i=0;i<n;i++){
		if(x[i].leftend())
			curr++;
		else
			curr--;
		if((i == n-1 ||x[i]<x[i+1])&&curr>sum)
			sum = curr;
	}
	return sum;
} 



猜你喜欢

转载自blog.csdn.net/qq_30501975/article/details/70234063