1. 程式人生 > >整數區間

整數區間

namespace != += i++ tdi csharp 行集 cin pac

 整數區間

【題目描述】

一個整數區間[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
*/

整數區間