Codeforce 22D Segments

题意:

    存在n个区间,我们至少能用多少个点将这几个区间固定住。

解析:

    我们可以对所有的线段进行一次排序:

    bool operator<(const Node &a)const
    {
        if(a.l==l)return r>a.r;
        return l<a.l;

    }

    我们就需要不断往数组中推入新的点。并更新。

1.如果数组顶的结点可以固定这个线段那么我只直接去询问下一个就可以了。

2.如果当前线段的右端点小于数组顶的元素我们可以将该元素缩小。(因为我们是按照l进行排序的所以我们缩小后的点之前满足的一样满足)

3.如果当前线段的左端点大于数组顶的元素,我们就往数组中推入一个元素。

#include<bits/stdc++.h>
using namespace std;
struct Node
{
    int l,r;
    bool operator<(const Node &a)const
    {
        if(a.l==l)return r>a.r;
        return l<a.l;
    }
} a[1005];
vector<int>v;
int main()
{
    int n;
    cin>>n;
    for(int i=0; i<n; i++)
    {
        cin>>a[i].l>>a[i].r;
        if(a[i].r<a[i].l)swap(a[i].l,a[i].r);
    }
    sort(a,a+n);
    int T=0;
    v.push_back(a[0].r);
    for(int i=1;i<n;i++){
        if(a[i].r>=v[v.size()-1]&&a[i].l<=v[v.size()-1])continue;
        else if(a[i].r<v[v.size()-1])v[v.size()-1]=a[i].r;
        else v.push_back(a[i].r);
    }
    printf("%d\n",v.size());
    for(int i=0;i<v.size();i++)cout<<v[i]<<" ";
    cout<<endl;
}

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lj130lj/article/details/79950348
个人分类: Codeforce
上一篇codeforce 22C System Administrator
下一篇Codeforce 106A Card Game
想对作者说点什么? 我来说一句

De2 115 VHDL

2014年11月01日 26.97MB 下载

Windows游戏编程大师技巧Part1

2011年04月21日 13.35MB 下载

Windows游戏编程大师技巧Part2

2011年04月21日 13.35MB 下载

Windows游戏编程大师技巧Part3

2011年04月21日 11.29MB 下载

安捷伦54621A示波器使用说明书

2009年09月12日 4.81MB 下载

IBP处理 matlab实现

2013年07月06日 3KB 下载

IBP在matlab中的程序代码

2013年07月06日 13KB 下载

没有更多推荐了,返回首页

关闭
关闭