题解 | #活动安排#
活动安排
https://ac.nowcoder.com/acm/problem/50161
活动安排:贪心思想,区间合并的一种转换,首先你需要对左区间从小到大进行排序,当左区间相等时右区间从小到大排序为最优解,初始答案为1,左端点为最小的左端点,右端点为对应右端点,当右端点大于等于此时的左端点答案加一,更新此时的右端点为现在的右端点,当右端点大于此时的右端点此时答案不变但当前集合最优解为现在的右端点,更新右端点,至于右端点在此时左右端点之间的情况没有任何影响,不需要考虑,最后输出答案,以下是代码:
#include <iostream>
#include <algorithm>
using namespace std;
struct w
{
int l;
int r;
};
bool cmp(struct w x,struct w y)
{
if(x.l!=y.l)
return x.l<y.l;
else
return x.r<y.r;
}
struct w a[1010];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i].l>>a[i].r;
}
sort(a,a+n,cmp);
int ans=0;
int l1=a[0].l;
int r1=a[0].r;
int cnt=1;
for(int i=1;i<n;i++)
{
if(r1<=a[i].l)
{
l1=a[i].l;
r1=a[i].r;
cnt++;
}
else
{
if(r1>=a[i].r)
r1=a[i].r;
}
}
cout<<cnt;
return 0;
}