(关于传送门...
他死了...
水出来营养膳食的我(咳咳过度开心导致脑子下线?
连题都看不懂乐死自己了
收拾收拾回家叭
----------------------------------------------------------------------------------------
题目描述
一个整数区间[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