题目描述
“多么希望醒来,回到了曾经读书的时光,现在经历的一切都是一场梦,我告诉同桌,说做了一个好长好长的梦,同桌骂我白痴,叫我好好听课。你看着窗外的场景,一切是那么熟悉,一切还是原来的样子……”李永林通过时空监测点听到40年前小张老师对这样说。
话说李永林等人将历史时间线划分了n个区域,我们可以将之看成是数轴上的n个闭区间[ai,bi]。现在设尽量少的监测点,使得每个区间都至少有一个点(不同区间内的点可以是同一个),问需要多少个监测点?
输入格式
第一行两个整数 N,表示有N个闭区间,随后N行,每行两个整数,表示区间左端和右端
输出格式
输出选择的点的最小数量
样例
Input 1
3 1 5 2 8 6 9
Output 1
2
样例解释
对于样例1,我们可以选择点3和点6,这样每个区间都至少有一个点,因此选择的点的最小数量为2。
数据范围
1<=N,a,b<=1000
#include<bits/stdc++.h>
using namespace std;
bool cmp(pair<int,int>a,pair<int,int>b){
return a.second<b.second;
}int main(){
int n,l,r,ans=1,last;
pair<int,int>p[1001];
cin>>n;
for(int i=0;i<n;i++)cin>>p[i].first>>p[i].second;
sort(p,p+n);
last=p[0].second;
for(int i=1;i<n;i++){
if(last<p[i].first){
ans++;
last=p[i].second;
}
}cout<<ans;
return 0;
}
改之后是这样:
#include<bits/stdc++.h>
using namespace std;
bool cmp(pair<long long,long long>a,pair<long long,long long>b){
if(a.first==b.first)return a.second>b.second;
return a.first<b.first;
}int main(){
long long n,ans=1,last,l,r;
vector<pair<long long,long long> >a;
cin>>n;
for(int i=0;i<n;i++){
cin>>l>>r;
a.push_back({l,r});
}sort(a.begin(),a.end(),cmp);
last=a[0].second;
for(int i=1;i<n;i++){
if(a[i].first>last){
last=a[i].second;
ans++;
}
}cout<<ans;
return 0;
}
还是10分
熊晨瑞
(怪盗基德)
6
还有你开这么多long long一个#define int long long就可以了
整理了一下代码:
#include<bits/stdc++.h>
#define ll long long
#define f first
#define s second
using namespace std;
bool cmp(pair<ll,ll>a,pair<ll,ll>b){
if(a.f==b.f)return a.s>b.s;
return a.f<b.f;
}int main(){
ll n,ans=1,last;
pair<ll,ll>a[1001];
cin>>n;
for(int i=0;i<n;i++)cin>>a[i].f>>a[i].s;
sort(a,a+n,cmp);
last=a[0].s;
for(int i=1;i<n;i++){
if(a[i].f>last){
last=a[i].s;
ans++;
}
}cout<<ans;
return 0;
}
王建力
(王建力)
14
按右边界排,右边界小的在前,因为判断2区间是否相交,是比较前一个的右边界和此时的左边界。