问题描述:有n项活动申请使用同一场所,每项活动有一个开始和结束时间,如果任何两个活动不能重叠,问如何选择这些活动,使得被安排活动数量达到最多。//将活动按进行时长排序,改编 void merge(item* left, item* mid, item* right) { item temp[N]; item* p1 = left, * p2 = mid + 1; int i = 0, j; while (p1 <= mid && p2 <= right) { if (p1->end <= p2->end) { temp[i++] = *(p1++); } else { temp[i++] = *(p2++); } } while (p1 <= mid) temp[i++] = (p1++); while (p2 <= right) temp[i++] = (p2++); for (j = 0; j < i; j++) { (left + j) = temp[j]; } } void sortByTime(item left, item right) { if(left<=right){ return; } item mid=left+(right-left)/2; sortByTime(left,mid); sortByTime(mid+1,right); merge(left,mid,right); } //相容算法(按时长排) int Select_ByTime(int record[N]) { int num = 0, i = 0,k,j; //记录所选项目的下标 record[i++] = 0; //记录选择项目总数 num++; for ( k = 1; k < N; k++) { //falg为1表示项目相容 int flag = 1; //按顺序判断活动k是否与已有活动相容 for ( j = 0; j < num; j++) { if ( activity[k].start < activity[record[j]].end && activity[k].end > activity[record[j]].start) { flag = 0; break; } } //相容则更新各值 if (flag == 1) { record[i++] = k; num++; } } return num; }请将上述代码修改正确输出正确结果
时间: 2024-02-05 14:03:41 浏览: 31
根据题目描述和代码,我们可以通过将活动按照进行时长排序,然后逐个判断是否与已有活动相容,来选择被安排的活动。
代码中需要以下修改:
1. 在 `merge` 函数中,指针类型变量 `temp` 需要加上 `item*` 类型的指针符号。
2. 在 `sortByTime` 函数中,传入参数应该是指针类型的 `item*`,而不是结构体类型的 `item`。
3. 在 `sortByTime` 函数中,递归调用时传入的参数应该是指针类型的 `item*`,而不是结构体类型的 `item`。
4. 在 `Select_ByTime` 函数中,定义变量 `k` 和 `j` 时需要加上类型声明。
5. 在 `Select_ByTime` 函数中,判断相容的条件应该是 `activity[k].start >= activity[record[j]].end || activity[k].end <= activity[record[j]].start`,即两个活动的时间没有重叠。
修改后的代码如下:
```
void merge(item* left, item* mid, item* right) {
item* temp = new item[N];
item* p1 = left, * p2 = mid + 1;
int i = 0, j;
while (p1 <= mid && p2 <= right) {
if (p1->end <= p2->end) {
temp[i++] = *(p1++);
}
else {
temp[i++] = *(p2++);
}
}
while (p1 <= mid) temp[i++] = *(p1++);
while (p2 <= right) temp[i++] = *(p2++);
for (j = 0; j < i; j++) {
*(left + j) = temp[j];
}
delete[] temp;
}
void sortByTime(item* left, item* right) {
if (left >= right) {
return;
}
item* mid = left + (right - left) / 2;
sortByTime(left, mid);
sortByTime(mid + 1, right);
merge(left, mid, right);
}
int Select_ByTime(int record[N]) {
int num = 0, i = 0, k, j;
record[i++] = 0;
num++;
for (k = 1; k < N; k++) {
int flag = 1;
for (j = 0; j < num; j++) {
if (activity[k].start >= activity[record[j]].end || activity[k].end <= activity[record[j]].start) {
continue;
}
else {
flag = 0;
break;
}
}
if (flag == 1) {
record[i++] = k;
num++;
}
}
return num;
}
```