#include<cstdio> #include<iostream> #include<algorithm>使用命名空间 std;int N;struct Act { int start; int end; }法案[100010];bool cmp(Act a,Act b) { return a.end<b.end; } int greedy_activity_selector() { int num=1,i=1; for(int j=2;j<=N;j++) { if(act[j].start>=act[i].end) { i=j; num++; } } return num; } int main() { int t; scanf(“%d”,&t); while(t--) { scanf(“%d”,&N); for(int i=1;i<=N;i++) { scanf(“%lld %lld”,&act[i].start,&act[i].end);} act[0].start=-1;act[0].end=-1;sort(act+1,act+N+1,cmp);int res=greedy_activity_selector();cout<<res<<endl;} }详细解释它,其中sort函数是怎么排序act[]数组的,
时间: 2024-02-28 08:54:28 浏览: 88
这是一段使用贪心算法解决活动安排问题的代码。在这个问题中,每个活动有一个开始时间和结束时间,而我们需要安排尽可能多的活动,使得它们不会相互冲突。该代码使用了贪心算法,按照活动的结束时间从早到晚排序,然后从前往后依次选取结束时间最早的可选活动,直到不能再选为止。下面逐行解释代码:
```cpp
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
int N;
struct Act {
int start;
int end;
} act[100010];
// 定义活动结构体
bool cmp(Act a, Act b) {
return a.end < b.end;
}
// 比较函数,按照结束时间从早到晚排序
int greedy_activity_selector() {
int num = 1, i = 1;
for (int j = 2; j <= N; j++) {
if (act[j].start >= act[i].end) {
i = j;
num++;
}
}
return num;
}
// 贪心算法,选取结束时间最早的可选活动
int main() {
int t;
scanf("%d", &t);
while (t--) {
scanf("%d", &N);
for (int i = 1; i <= N; i++) {
scanf("%lld %lld", &act[i].start, &act[i].end);
}
act[0].start = -1;
act[0].end = -1;
sort(act + 1, act + N + 1, cmp);
// 按照结束时间排序
int res = greedy_activity_selector();
cout << res << endl;
}
}
// 主函数,读入数据,排序,输出结果
```
其中,`sort`函数按照结束时间从早到晚排序,使用了自定义的比较函数`cmp`,该函数返回`true`表示`a`的结束时间早于`b`的结束时间,`sort`函数会将`a`放在`b`前面。在本代码中,`sort`函数的调用为:
```cpp
sort(act + 1, act + N + 1, cmp);
```
其中,`act + 1`表示排序的起始位置,`act + N + 1`表示排序的结束位置,`cmp`表示比较函数。
阅读全文