栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

905 区间选点

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

905 区间选点

 题意:尽可能少的点,让所有的区间都至少有一个点

贪心题:猜想+证明

 分析:1.让区间按照右端点的大小从小到大排序

            2.如果一个区间没有被放入点,就在他的右端点放一个点,如果这个区间已经被放入点了,则直接pass

也就是两个及以上不完全覆盖的区间,放一个点就可以了

一个区间不需要放两个点使他们和前后区间"串联"

时间复杂度 O(nlogn)
证明
证明ans<=cnt :cnt 是一种可行方案, ans是可行方案的最优解,也就是最小值。

证明ans>=cnt : cnt可行方案是一个区间集合,区间从小到大排序,两两之间不相交。

所以覆盖每一个区间至少需要cnt个点。

#include 
#include 
using namespace std;
const int N = 100005;
typedef long long ll;
bool st[N];
struct PII
{
    int l, r;
    bool operator< (const PII b)const
    {
        return r < b.r ? true : false;
    }
}a[N];
int main()
{
    int n;
    cin >> n;
    for (int i = 0;i < n;i++)
        cin >> a[i].l >> a[i].r;
    sort(a, a + n);
    ll res = 0;
    int end = -2e9;
    for (int i = 0;i < n;i++)
        if (a[i].l > end)
        {//当前区间
            res++;
            end = a[i].r;
        }
    cout << res << 'n';
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/665198.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号