整数区间
【题目描述】
一个整数区间[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
其实o(n^2)的算法很好想,但o(n)就比较狗了。主要思路就是两个变量f1,f2,假设取这两个点。剩下看代码。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct node{
int a;
int b;
};
node m[1000];
bool cmp(node a,node b) //头从小到大排序
{
if(a.a != b.a)
{
return a.a < b.a;
}
else
return a.b < b.b;
}
int main()
{
int n,f1,f2,tot = 0;
cin>>n;
for(int i = 1;i <= n;i++)
{
cin>>m[i].a>>m[i].b;
}
sort(m + 1,m + n + 1,cmp);
f1 = m[n].a;
f2 = m[n].a + 1;
tot += 2;
for(int i = n - 1;i > 0;i--)
{
if(m[i].b < f1) //两区间分离,则同时改变f1,f2,f1 = 头;f2 = 头+1;
{
tot += 2;
f1 = m[i].a;
f2 = f1 + 1;
}
else if(m[i].b < f2) //两区间重合,f2 = 原来的f1,f1 = 现在区间的头
{
tot ++;
f2 = f1;
f1 = m[i].a;
}
}
cout<<tot<<endl;
return 0;
}
/*
4
3 6
2 4
0 2
4 7
*/