905 区间选点

905 区间选点,第1张

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';
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5670465.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存