洛谷-P1803-线段覆盖

凌乱的yyy / 线段覆盖 - 洛谷


解题思路:

1.要求yyy最多能够参加的比赛,首先分析,如果比赛的开始时间和 上一场的比赛结束时间都是不相交的,那么他所有的比赛都可以 参加,如果有相交的话,分为两种情况,一种是包含,一种是重 叠,如下图所示

2. 分析重合的情况,应该参加结束时间更少的比赛,这样的话,能 够为后面比赛的开始时间提供更多空间,重叠的情况同样适用, 所以两者都应该是以结束时间较早的为选择

3. 那么现在只需要建立一个结构体变量,用来存储他的开始时间和 结束时间,然后以结束时间排序即可

4.完成排序后,标记第一场比赛的结束时间,如果下一场的开始时 间时大于结束时间的,便可以参加比赛,sum++,并且更新标 记,此时的结束时间应该为当前数组位置的变量的结束时间


#include<bits/stdc++.h>
using namespace std;
struct game{
    int left;
    int right;//分别存储每场比赛的开始时间和结束时间 
}a[1000005];

bool cmp(game x,game y)
{
    return x.right<y.right;
}
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i].left>>a[i].right;
    }

    sort(a+1,a+n+1,cmp);

    int finsh=a[1].right;//设定标签为第一场比赛结束的时间 
    int sum=1;//第一场比赛肯定可以参加

    for(int i=2;i<=n;i++)
    {
        if(a[i].left>=finsh)//如果本场比赛的开始时间大于上一场比赛的结束时间 
        {
            sum++;//比赛次数加1 
            finsh=a[i].right;//更新结束时间 
        } 
    }

    cout<<sum; 
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值