会场安排问题

Question4

N is a non-negative integer, remove k digits from it to obtain a new
number. Find the biggest possible output number.
Input: N= 147128, k= 3 Output: 728
用贪心选择策略解会场安排问题。

贪心算法重要的两个性质:贪心选择性质和最优子结构性质

证明:

首先将会场安排问题数学化,设有n个活动的集合 e= { 1 ,2 ,…,n },每个活动 i 都有一个要求使用该会场的起始时问si 和一个结束时问fi 。即k是所需最少会场的个数。设活动已排序,( a1 , a2 , … ,ak )是所需要的k个已安排了活动的会场。①当k = 1时,也就是所有的活动在一个会场里相容,a1 是满足贪心选择性质的最优解;②当k>= 2时,取b1=a1,bk=ak (即bk是安排了m个活动的一个会场,(n-m)个活动都安排在b1 到bk-1个会场里)。就是(n-m)个活动安排需要(k -1)个会场。则(b1,b2 ,…,bk-1 )是(n - m)个活动可行解。另一方面,由{( a1 ,a2,…,ak)-ak}=(b1,b2,…,bk-1)知,(b1,b2,…,bk-1)也是满足贪心选择性质的最优解,所以,会场安排问题具有贪心选择性质。

#include 
#include 
using namespace std;
struct perform{
	int start,end;
};
bool compare(perform a,perform b){
	return a.start<b.start;
}
int main(){
	int n,num=1;
	cin>>n;
	perform p[100],temp[100];
	for(int i=0;i<n;i++)
	cin>>p[i].start>>p[i].end;
	sort(p,p+n,compare);
	temp[0]=p[0];
	int j;
	for(int i=1;i<n;i++){
		for(j=0;j<num;j++){
			if(p[i].start>=temp[j].end){
				temp[j]=p[i];
				break;
			}
		}
		if(j==num){
			temp[num++]=p[i];
		}
	}
	cout<<num;
}

复杂度分析

时间复杂度:快速排序算法O(nlogn)

空间复杂度:O(n)

你可能感兴趣的:(贪心,leetcode,贪心算法,算法)