1324:【例6.6】整数区间
【题目描述】
请编程完成以下任务:
1.读取闭区间的个数及它们的描述;
2.找到一个含元素个数最少的集合,使得对于每一个区间,都至少有一个整数属于该集合,输出该集合的元素个数。此题不太明,应该是输出符合要求的集合的个数。不是元素个数。
【输入】
首行包括区间的数目n,1≤n≤10000,接下来的n行,每行包括两个整数a,b,被一空格隔开,0≤a≤b≤10000,它们是某一个区间的开始值和结束值。
【输出】
第一行集合元素的个数,对于每一个区间都至少有一个整数属于该集合,且集合所包含元素数目最少。
输出应是一行,集合的个数,对于每个区间都至少有一个整数属于该集合。只要一个区间和另一个区间没有相同的元素,就是两个集合了。
【输入样例】
4
3 6
2 4
0 2
4 7
【输出样例】
2
此题和上题1323【例6.5】活动选择一样的道理。我只加了个等号^-^
//好像电影节,和上一题及相似,取结束时间排序(区间的终点),相同的以开始时间(区间的开始点)再排序
//用第一个的终点作为查找另一个的开始点,比它小的,相等的不行
//找到后,再重复把终点作为开始点来查下一个。
//Writed by Wangzhimin Date:2023/11/22
#include<bits/stdc++.h>
using namespace std;
struct huo {//
int b;
int e;
bool operator<(const huo & h)//
{
if(e==h.e)
return b<h.b;
else
return e<h.e;
}
}huos[1005];
int main()
{
int i,j,n;
scanf("%d",&n);//有几组
for(i=0;i<n;i++)//输入的存入结构体
scanf("%d%d",&huos[i].b,&huos[i].e);
sort(huos,huos+n);//排序
int begini,sum=1;
begini=huos[0].e;//把第一个的结束时间作为查下一个的开始时间
for(i=1;i<n;i++){
if(begini>=huos[i].b)
continue;//没合适的,i就加1,再查
else//开始时间符合要求,就把这个的结束时间作为开始时间再查
{
begini=huos[i].e;
sum++;
}
}
printf("%d",sum);
}
//信息学奥赛的贪心都做完了,哈哈哈哈哈