活动安排问题
算法思路
贪心策略:活动结束最早的且与已安排活动无冲突的活动优先安排。
贪心选择性质证明:
将数组a中的元素以活结束时间从小到大排序。
假设(a[k],a[2],…,a[n])为活动安排问题的一个最优解。
①如果a[k]=a[1],(a[1],a[2],…,a[n])为活动安排问题的一个最优解。
②如果a[k]!=a[1],a[k]的结束时间>=a[1]的结束时间,那么(a[k],a[2],…,a[n])中的a[k]用a[1]替代,(a[1],a[2],…,a[n])仍为活动安排问题的一个最优解。
所以a[1]一定存在于最优解中。同理可以求出{a[2]……a[n]}的下一个应该安排的活动。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef struct num{
int n;
int b;
int e;
}num;
bool cmp(num a, num b){
return a.e < b.e;
}
int main(){
int n;
while(cin >> n){
num a[100]={{0,0,0}};
int i = 0;
while(i != n){
a[i].n = 1 + i;
cin >> a[i].b;
i++;
}
i = 0;
while(i != n){
cin >> a[i].e;
i++;
}
sort(a, a+n, cmp);
// while(n--){
// cout << a[n].n << " " << a[n].e << endl;
// }
i = 0;
int j = 1;
cout << a[i].n << " ";
while(j != n){
if(a[j].b >= a[i].e){
cout << a[j].n << " ";
i = j;
}
j++;
}
cout << endl;
}
}