#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; } } 解释它
时间: 2024-04-28 14:21:11 浏览: 81
这是一段 C++ 代码,它实现了贪心算法来解决活动选择问题。
活动选择问题是指在一段时间内,有多个活动可供选择,每个活动都有一个开始时间和结束时间,要求选择尽可能多的活动,使它们不会相互冲突。
这段代码中,首先读入测试数据的数量 t,然后对于每组测试数据,读入活动数量 N 和每个活动的开始时间和结束时间,存储在一个结构体数组 act 中。
然后对 act 数组按照结束时间进行排序,使用贪心算法来选择活动。贪心策略是每次选择结束时间最早的活动,并且保证所选活动与前面已选活动不冲突。具体实现是用一个指针 i 指向当前已选的最后一个活动,每次遍历到一个新的活动 j 时,如果它的开始时间大于等于 i 活动的结束时间,就选择该活动,并将指针 i 移动到 j。
最后输出所选活动的数量。
该代码还对每组测试数据都执行了多次,每次输出一组测试数据的结果。
阅读全文