资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
强大的kAc建立了强大的帝国,但人民深受其学霸及23文化的压迫,于是勇敢的鹏决心反抗。
kAc帝国防守森严,鹏带领着小伙伴们躲在城外的草堆叶子中,称为叶子鹏。
kAc帝国的派出的n个看守员都发现了这一问题,第i个人会告诉你在第li个草堆到第ri个草堆里面有人,要求你计算所有草堆中最少的人数,以商议应对。
“你为什么这么厉害”,得到过kAc衷心赞美的你必将全力以赴。
输入格式
第一行一个数字n,接下来2到n+1行,每行两个数li和ri,如题。
输出格式
输出一个数,表示最少人数。
样例输入
5
2 4
1 3
5 7
1 8
8 8
样例输出
3
数据规模和约定
30%的数据n<=10
70%的数据n<=100
100%的数据n<=1000
所有数字均在int表示范围内
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int N=10e3+10;
vector<pair<int,int>> data;
int n;
int countNum(){
if(data.empty()){
return 0;
}
sort(data.begin(),data.end());
int end=data[0].second;
int count=0;
for(int i=1;i<data.size();i++){
if(data[i].second<=end){
end=min(data[i].second,end);
}else{
count++;
end=data[i].second;
}
}
return count;
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++){
int a,b;
scanf("%d%d",&a,&b);
data.push_back({a,b});
}
//求各个区间的交集,交集的个数即为答案
printf("%d\n",countNum());
return 0;
}
但是不能用c++11:
因此用二维数组替代vector:
#include<iostream>
using namespace std;
const int N=10e3+10;
int data[N][2];
int n;
int countNum(){
if(n==0){
return 0;
}
//插入排序
for(int i=0;i<n-1;i++){
for(int j=i+1;j<n;j++){
if(data[i][0]>data[j][0]){
int t;
t=data[i][0];
data[i][0]=data[j][0];
data[j][0]=t;
t=data[i][1];
data[i][1]=data[j][1];
data[j][1]=t;
}
}
}
int end=data[0][1];
int count=1;
for(int i=0;i<n;i++){
if(data[i][0]<=end){
end=min(data[i][1],end);
}else{
count++;
end=data[i][1];
}
}
return count;
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d%d",&data[i][0],&data[i][1]);
}
printf("%d\n",countNum());
return 0;
}