整数区间
时间限制: 1Sec 内存限制: 128MB
题目描述
请编程完成以下任务:
1.从文件中读取闭区间的个数及它们的描述;
2.找到一个含元素个数最少的集合,使得对于每一个区间,都至少有一个整数属于该集合,输出该集合的元素个数。
输入
首行包括区间的数目n,1≤n≤10000,接下来的n行,每行包括两个整数a,b,被一空格隔开,0≤a≤b≤10000,它们是某一个区间的开始值和结束值。
输出
第一行集合元素的个数,对于每一个区间都至少有一个整数属于该区间,且集合所包含元素数目最少。
样例输入
4
3 6
2 4
0 2
4 7
样例输出
2
思路
模型为给n个闭区间,在数轴上选尽量少的点,使每个区间内至少有一个点
首先多关键词排序:数据按右区间升序排序。排序优先级:右区间>左区间,也就是当右区间相同时,升序比较左区间。
其次循环标记:每次标记区间右端点x,并右移当前区间指针,直到当前区间不包含x,再重复上述步骤。
import java.util.Scanner;
public class Main {
static int[] a=new int[10001];
static int[] b=new int[10001];
static int n=0;
public static void main(String[] args){
data(); //数据初始化
qsort(0,n-1); //多关键词排序
solve(); //循环标记
}
static void data(){
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
for(int j=0;j<n;j++){
a[j]=sc.nextInt();
b[j]=sc.nextInt();
}
}
static void qsort(int x,int y){
int i=x , j=y ,mid1=b[(x+y)/2] , mid2=a[(x+y)/2], t=0;
while(i<=j){
while((b[i]<mid1)|| ((b[i]==mid1)&& (a[i]<mid2))) i++; //比较条件
while((b[j]>mid1)|| ((b[j]==mid1)&& (a[j]>mid2))) j--; //比较条件
if(i<=j){
t=b[i]; b[i]=b[j]; b[j]=t;
t=a[i]; a[i]=a[j]; a[j]=t;
i++;j--;
}
}
if(x<j) qsort(x,j);
if(i<y) qsort(i,y);
}
static void solve(){
int sum=0;
for(int i=0,x=-1;i<n;i++){
if(x>=a[i]) continue; //如果当前区间包含标记点 则跳过
sum++;
x=b[i]; //更新标记点
}
System.out.print(sum);
}
}