码迷,mamicode.com
首页 > 其他好文 > 详细

活动安排

时间:2019-09-28 13:09:36      阅读:85      评论:0      收藏:0      [点我收藏+]

标签:起点   style   ++   ali   clu   include   活动   div   namespace   

活动安排

https://loj.ac/problem/10000

题目描述

  在时间轴上,有n条线段,起点为si,终点为fi,求最多选取多少条线段使其两两互不相交。不过注意这里的区间为一段闭,一段开,可直接用贪心。

思路

  我们先考虑将n条线段按右端点升序序排序,若右端点相同则按左端点升序排序(其实左端点无所谓)。那么,我们只需升序查找判断当前线段能放入即可,若可以,则ans++,否则就继续循环。这个贪心策略显然是对的,因为我们如果能选择当前[si,fi),[sj,fj)(fi<fj)这两条线段,那么我们可以选择第一条线段,这样对后续状态影响最小,并且肯定可以选,这样必定会是最优情况下的方案之一。

代码

#include <bits/stdc++.h>
using namespace std;
struct aa
{
    int st,ed;
}a[1100];
bool cmp(aa x,aa y)
{
    if(x.ed!=y.ed)return x.ed<y.ed;
    else return x.st<y.st;
}
int main() 
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
        scanf("%d%d",&a[i].st,&a[i].ed);
    sort(a,a+n,cmp);
    int ans=0,k=0;
    for(int i=0;i<n;i++)
        if(a[i].st>=k)
        {
            k=a[i].ed;
            ans++;
        }
    printf("%d",ans);
    return 0;
}

 

活动安排

标签:起点   style   ++   ali   clu   include   活动   div   namespace   

原文地址:https://www.cnblogs.com/fangbozhen/p/11602364.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!