贪心算法——活动选择

贪心算法,选择局部最优解

活动选择问题,每个活动有开始时间s,结束时间f,找到最大兼容活动集。假设f按照大小顺序排好。

每次就从当前结束时间往后选最近的开始时间的活动

#include <iostream>
#include <map>
#include <vector>

using namespace std;

//void ActivitySelect(map<int,int> & activity,int k,int n,vector<int> & result);//map第一个int是活动结束时间即f,map数据是按照顺序存储的,也即按照结束时间排序了,k是当前求解的子问题Sk,问题规模n 
void ActivitySelect(int s[],int f[],int k,int n,vector<int> & result);//n个活动,s,f都是n+1维的,第一个设置为0,0代表空的一个活动,k是当前已经安排好的第K个活动 
//存在一个问题是map不能存储相同键值的数据,所以得自己另外输入一下,然后再排个序 

//迭代贪心算法,同样s,f是n+1维的 
void  ActivitySelectIterate(int s[],int f[],int n,vector<int> & result);

void FastSort(int a[],int data [],int left, int right); 

int main()
{
	/*map<int,int>  activity;
	activity.insert(make_pair(4,1));
	activity.insert(make_pair(5,3));
	activity.insert(make_pair(6,0));
	activity.insert(make_pair(7,5));
	activity.insert(make_pair(9,3));
	activity.insert(make_pair(9,5));
	activity.insert(make_pair(10,6));
	activity.insert(make_pair(11,8));
	activity.insert(make_pair(12,8));
	activity.insert(make_pair(14,2));
	activity.insert(make_pair(16,12));
	
	
	int n=activity.size();
	*/
	vector<int> result;
	int n=11;
	int *s=new int[n+1];
	int *f=new int[n+1];
	//map<int,int>::iterator it;
	int i=1;
	s[0]=0;
	f[0]=0; 
	f[1]=5; 
	s[1]=3;
	f[2]=7; 
	s[2]=5;
	f[3]=6; 
	s[3]=0;
	f[4]=4; 
	s[4]=1;
	f[5]=9; 
	s[5]=5;
	f[6]=9; 
	s[6]=3;
	f[7]=11; 
	s[7]=8;
	f[8]=10; 
	s[8]=6;
	f[9]=16; 
	s[9]=12;
	f[10]=14; 
	s[10]=2;
	f[11]=12; 
	s[11]=8;

	
	
/*	for(it=activity.begin();it!=activity.end();it++,i++){
		s[i]=it->second;
		f[i]=it->first;
		cout<<"si="<<s[i]<<" fi="<<f[i]<<endl;
	}*/
	//ActivitySelect(s,f,0,n,result);
	FastSort(f,s,0,n);
	ActivitySelectIterate(s,f,n,result);
	for(int i=0;i<result.size();i++)	cout<<" result="<<result[i];
}
 
void ActivitySelect(int s[],int f[],int k,int n,vector<int> & result){
	int m = k+1;//准备安排第k+1个活动 
	while(m<=n&&s[m]<f[k])	m++;//找到某个开始时间在k活动后的 
	if(m<=n){
		cout<<"sm="<<s[m]<<"fm="<<f[m]<<endl;
		result.push_back(m);
		return ActivitySelect(s,f,m,n,result);
	}
	else return;
}

void  ActivitySelectIterate(int s[],int f[],int n,vector<int> & result){
	result.push_back(1);
	cout<<"sm="<<s[1]<<"fm="<<f[1]<<endl;
	int k=1;
	int m;
	for(m=2;m<=n;m++){
		if(s[m]>=f[k]){
			cout<<"sm="<<s[m]<<"fm="<<f[m]<<endl;
			result.push_back(m);
			k=m;
		}
	} 
	return;
}
inline void Swap(int &a,int &b)
{
	int temp;
	temp = a;
	a = b;
	b = temp;
}
void FastSort(int a[],int data[],int left, int right) 
{
	if(left >= right)
		return;
	int reference = a[right];
	int index_left = left,index_right = right;
	int i = 0;
	while(index_left!= index_right)
	{
		while(index_left!=index_right)
		{
			if(a[index_left]>reference) break;
			index_left++;
		}
		while(index_left!=index_right)
		{
			if(a[index_right]<reference) break;
			index_right--;
		} 
		Swap(a[index_left],a[index_right]); 
		Swap(data[index_left],data[index_right]); 
	}
	Swap(a[index_left],a[right]); 
	Swap(data[index_left],data[right]); 

	FastSort(a,data,left,index_left-1);
	FastSort(a,data,index_left+1,right);
	
}
 /*
void ActivitySelect(map<int,int> & activity,int k,int n,vector<int> & result){//k的范围是0到n, 
	int m=k+1;
	map<int,int>::iterator itm,itk;
	itm=activity.begin();
	itk=activity.begin();
	for(int i=0;i<k;i++) itk++;
	for(int i=0;i<m;i++) itm++;

	int count=0;
	while(m<=n&&itm->second<itk->first){
		itm++;
		count++;
	}	
	if(count<=n){
		result.push_back(count);
		ActivitySelect(activity,k,n,result);
	} 
	else return;
}*/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值