P1803 凌乱的yyy / 线段覆盖 - 贪心

P1803 凌乱的yyy / 线段覆盖

题目意思

  • 有若干线段,可能重复也可能没有重复
  • 如何挑选线段选择的线段最多。
  • 挑选的线段不能重复

想法:

  • 按照结束时间排序
  • 如果下一段开始时间大于上一段时间的结束时间,那么就选取下一线段
  • 如图:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ymjakLAw-1591072340679)(…/…/…/…/%E5%9D%9A%E6%9E%9C%E5%90%8C%E6%AD%A5%E6%96%87%E4%BB%B6%E5%A4%B9/%E6%88%91%E7%9A%84%E5%9D%9A%E6%9E%9C%E4%BA%91/%E7%AE%97%E6%B3%95/greed/P1803%20%E5%87%8C%E4%B9%B1%E7%9A%84yyy%20%20%E7%BA%BF%E6%AE%B5%E8%A6%86%E7%9B%96.assets/1588299998369.png)]

代码:

//P1803 凌乱的yyy / 线段覆盖
// Created by majoe on 2020/5/1.
//https://www.luogu.com.cn/problem/P1803

#include <bits/stdc++.h>
using namespace std;

//n记录总的线段数,cnt记录最多能挑选多少个线段
int n,cnt=1;

//定义线段,s为开始时刻,t为终止时刻
struct line{
    int s,t;
}lines[1000010];

bool cmp(line l1,line l2){
    return l1.t < l2.t;
}
int main(){
    cin >> n;

    //输入
    for (int i = 1; i <=n; ++i) {
        cin >> lines[i].s >> lines[i].t;
    }
    //按结束时间排序
    sort(lines+1,lines+1+n,cmp);

    int temp = lines[1].t;
    for (int i = 2; i <= n ; ++i) {
        if(temp <= lines[i].s){
            cnt++;
            temp = lines[i].t;
        }
    }

    cout << cnt;
    return 0;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值