书上的例子,活动选择问题
<span style="font-size:10px;">typedef struct Act
{
int s;
int f;
}Act;
bool cmp(Act a, Act b)
{
return a.f <b.f;
}
int GreedyActSelector(Act* s, int n, Act* A)
{
int m = 0, k =0;
A[0] = s[0];
for(m=1; m<n; ++m)
{
if(s[m].s >= A[k].f)
{
A[++k] = s[m];
}
}
return k;
}
int main()
{
int n = 0,i=0;
cout<<"输入活动个数: "<<endl;
cin>>n;
Act*arr = new Act[n];
Act* A = new Act[n];
cout<<"输入"<<n<<"个活动的开始和结束时间:"<<endl;
for(i=0;i<n;++i)
cin>>arr[i].s>>arr[i].f;
sort(arr,arr+n,cmp);
int k = GreedyActSelector(arr,n,A);
cout<<"选择的活动:"<<endl;
for(i=0;i<=k;++i)
cout<<A[i].s<<","<<A[i].f<<endl;
return 0;
}</span>
区间着色问题,改了蛮久的,因为没有考虑清楚,每一个标注了true的跳过,从第一个false的开始,但是必须注意的是对该活动也要标注,记录在count中不然就不会跳出循环。
//贪心算法,活动选择问题
typedef struct Act
{
int s;
int f;
bool flag;
int r;
}Act;
bool cmp(Act a, Act b)
{
return a.f <b.f;
}
int GreedyActSelector(Act* s, int n)
{
int m = 0,count=0, end=0, room =0;
while(count<n)
{
++ room;//再开辟新房间
for(m=0;s[m].flag;++m);//找到第一个false,并对其进行分配
s[m].flag = true;//标记已分配
s[m].r = room;//写房间号
end = s[m].f;//记录新的结束时间
++ count;//已经分配房间的个数
//cout<<"end "<<end<<"room "<<room<<"count "<<count<<endl;
for(; m<n; ++m)
{
if((s[m].s >= end) && (!s[m].flag))
{
s[m].flag = true;//标记已分配
s[m].r = room;//写房间号
end = s[m].f;//记录新的结束时间
++ count;//已经分配房间的个数
//cout<<"end "<<end<<"room "<<room<<"count "<<count<<endl;
}
}
}
cout<<room;
return room;
}
int main()
{
int n = 0,i=0;
cout<<"输入活动个数: "<<endl;
cin>>n;
Act*arr = new Act[n];
cout<<"输入"<<n<<"个活动的开始和结束时间:"<<endl;
for(i=0;i<n;++i)
{
cin>>arr[i].s>>arr[i].f;
arr[i].flag =false;
}
sort(arr,arr+n,cmp);
int k = GreedyActSelector(arr,n);
return 0;
}