-->
当前位置:首页 > 题库 > 正文内容

程序填空题:求解活动安排问题(贪心法)

Luz4年前 (2021-05-10)题库947
假设有一个需要使用某一资源的n个活动所组成的集合S,S={1,…,n}。该资源任何时刻只能被一个活动所占用,活动i有一个开始时间bi和结束时间ei(bi一旦某个活动开始执行,中间不能被打断,直到其执行完毕。若活动i和活动j有bi≥ej或bj≥ei,则称这两个活动兼容。
设计算法求一种最优活动安排方案,使得所有安排的活动个数最多。

```c++
#include
#include
#include
#include
using namespace std;
#define MAX 51
//问题表示
struct Action
{ int b; //活动起始时间
int e; //活动结束时间
bool operator<(const Action &s) const //重载<关系函数
{
return e<=s.e; //用于按活动结束时间递增排序
}
};

int n;
Action A[MAX];
bool flag[MAX]; //标记选择的活动
int Count=0; //选取的兼容活动个数

void solve() //求解最大兼容活动子集
{
memset(flag,0,sizeof(flag));//初始化为false
sort(A,A+n); //A[1..n]按活动结束时间递增排序
int preend=0; //前一个兼容活动的结束时间
for (int i=0;i { if ()
{ ;
;
}
}
}

int main()
{ cin>>n;
for (int i=0;i cin>>A[i].b>>A[i].e;
solve();
for (int i=0;i if (flag[i])
{
printf("[%d,%d]\n",A[i].b,A[i].e);
Count++;
}
cout< return 0;
}

```

### 输入格式:

第一行是一个整数n,接着的n行中每一行包括两个整数b和e,其中b是一个订单开始时间,e是的结束时间。。

### 输出格式:
若count表示最大兼容活动集合数,先输出count行,每行为活动的开始时间和结束时间。最后输出count。

### 输入样例1:

```in
11
1 4
3 5
0 6
5 7
3 8
5 9
6 10
8 11
8 12
2 13
12 15
```

### 输出样例1:

```out
[1,4]
[5,7]
[8,11]
[12,15]
4
```





答案:
第1空:A[i].b>=preend

第2空:flag[i]=true

第3空:preend=A[i].e

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。