贪心算法,选择局部最优解
活动选择问题,每个活动有开始时间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;
}*/