제목 : 지령치 범위
샤프트 N 폐 구간 [A_I, b_i]의 번호를 갖는다 : 이탈리아있다. 적어도 하나의 포인트를 갖도록 몇 점으로서 받아 각 구간 (시점은이를 함유 다른 부분 일 수있다)
입력 :
N (N <= 100) 정수의 첫 번째 행
2 ~ N + 1 개 라인의 각각의 두 정수 A, B (A, B < = 100)
: 출력
선택된 포인트를 나타내는 정수의 숫자
예를 들면 :
아이디어 문제점 해결이 타이틀은 탐욕, 현재 유지 보수의 값을 찾아, 우리는 세그먼트의 최종 엔드 포인트에 따라, 큰 순서로 작은 본 항에 엔드 판을 촬영 한 후, (동일한 시점에 따라 내림차순)라고 주장 라인에. 이 방법은 작업을 수행 할 수 있습니다 왜 그렇게.
이 배수 순서를 가정하면, 우리가 선 세그먼트의 마지막 끝점을하는 것은, 지금 우리는 그 선을 선택하는 남아있는 원본을 건너 뛸 수 있습니다, 바로이 세그먼트가 선택되지 않습니다 이동할 수 있도록, 당신은 찾을 수 없습니다 효과는 전부이 더 얻을 것이다 욕심이 없습니다.
코드 :
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
bool cmp(pair<int,int> a,pair<int,int> b)
{
if(a.second!=b.second)
{
return a.second<b.second;
}else
{
return a.first>b.first;
}
}
int main()
{
int n,x,y;
cin>>n;
vector<pair<int,int> > h;
for(int i=0;i<n;i++)
{
cin>>x>>y;
h.push_back(make_pair(x,y));
}
sort(h.begin(),h.end(),cmp);//排序
int total=1,flag=h[0].second;
for(int i=1;i<h.size();i++)
{
if(h[i].first<=flag&&flag<=h[i].second)//如果这个备选过了,就跳过
{
continue;
}else
{
flag=h[i].second;//不然更新
total++;
}
}
cout<<total<<endl;
}