整数区间--模拟

(关于传送门...

他死了...

水出来营养膳食的我(咳咳过度开心导致脑子下线?

连题都看不懂乐死自己了

收拾收拾回家叭

----------------------------------------------------------------------------------------

题目描述
一个整数区间[A,B]
请编程完成以下任务:
1.从文件中读取区间的个数及其它们的描述;
2.找到满足下述条件的所含元素个数最少的集合中元素的个数,对于每一个区间,都至少有两个不同的整数属于该集合。


输入
首行包括区间的数目 n,1<=n<=10000,接下来的 n 行,每行包括两个整数 a,b,被一空格隔开,0<=a<=b<=10000,它们是某一个区间的开始值和结束值。


输出
第一行集合元素的个数,对于每一个区间都至少有两个不同的整数属于该区间,且集合所包含
元素数目最少。


样例输入

4

3 6

2 4

0 2

4 7

样例输出

4

----------------------------------------------------------------------------------------

我理解的题意:

求一个集合,是每一个区间在这个集合中都至少有两个元素,输出集合元素个数

贪心:

把区间先按右端点从小到大排序

开两个变量来记录位置

(保证x  < y)

如果区间右端点大于y

则这个区间者少有两个数被劝进集合中了

continue掉就好了

如果区间的右端点在x和y之间

把x变成y,y变成这个区间的左端点

同时ans++

如果区间的右端点小于x

x变成区间的左端点,y变成区间的右端点

同时ans+=2

#include<cstdio>
#include<algorithm>
using namespace std;

inline int read()
{
    int sum = 0,p = 1;
    char ch = getchar();
    while(ch < '0' || ch > '9')
    {
        if(ch == '-')
            p = -1;
        ch = getchar();
    }
    while(ch >= '0' && ch <= '9')
    {
        (sum *= 10) += ch - '0';
        ch = getchar();
    }
    return p * sum;
}

int n,ans,x,y;
struct qwq
{
    int l,r;
    bool operator < (const qwq& other)const
    {
        return r < other.r;
    }
}q[10005];

int main()
{
    n = read();
    for(int i = 1;i <= n;i++)
        q[i].l = read(),q[i].r = read();
    sort(q+1,q+n+1);
    x = y = -1;
    for(int i = 1;i <= n;i++)
    {
        if(x >= q[i].l && y >= q[i].l)
            continue;
        else
        if(y >= q[i].l)
        {
            x = y;
            y = q[i].r;
            ans++;
        }
        else
        {
            x = q[i].r - 1;
            y = q[i].r;
            ans += 2;
        }
    }
    printf("%d",ans);
    return 0;
} 
原文地址:https://www.cnblogs.com/darlingroot/p/10890469.html