설정 값 범위
제목 설명
N 폐 구간 [A_I, b_i]을 대수 축. 적어도 하나의 포인트를 갖도록 몇 점으로서 받아 각 구간 (시점은이를 함유 다른 부분 일 수있다)
입력 형식
N (N <= 100) 정수 첫 번째 행의 AN
2 ~ N + 1 개 라인의 각각의 두 정수 A, B (A, B < = 100)
출력 형식을
선택한 점의 수를 나타내는 정수를
견본
입력
2
1 5
4 6
출력
1
입력
3
1 3
2 5
4 6
출력
2
문제 해결 방안
이 문제는 부분적인 욕심 전략을.
입력 완료 후 각 섹션에, 그들을 분류 :
- 작은 말의 섹션 앞서
- 경우 동일한 섹션의 끝에 큰 전면의 헤드 부
다음 섹션은 예를 들어 (도 같은 규칙에 따라 정렬 된 양호)으로 설명한다 :
- 우리는 엔드 포인트의 범위를 선택한 후, 총 포인트 = 1을 계산합니다. 찾기 어렵지 않다,이 때 첫 번째 클릭은 모든 섹션 curlast 점에 여기, 설정을 (우리가 정렬 때문에) 같은 엔드 포인트가 조금있을 것입니다 때.
- 시작 지점의 범위는 현재 curlast 전에 발생하는 경우 이미의 범위 내에서 포인트가 있기 때문에 간격 후 다음 보면,이 시간에, 당신은 상관없이이 부분을 건너 뛸 수 있습니다. (그림 2 절과 3 절로서, 우리는 점 curlast에 빨간 아직이 시간)
- 우리가 두 번째를 선택해야하므로 ", 제 6 지점이를"우리가 우리가 간격 6 단지 curlast 후 시작점을 발생하고, 그 때, curlast 점을 충족하지 수 있다는 것을 발견, 읽기 점, 우리는 여전히 점을 최종 선택합니다. 이 때, 파란색 위치 curlast = 2를 계산합니다.
- , 읽기 curlast 점은 생략하기 전에 점슛 7을 시작합니다.
- 8 구간 시작 지점 curlast 시점 이후, 우리는 이전의 두 업데이트 curlast와 함께 작동합니다. 이제 녹색 장소 curlast = 3을 계산합니다.
- 우리는 모든 범위 트래버스는, 종료 코드는, 결과는 3 것으로 나타났습니다;
코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct TimeCell
{
int start;
int end;
TimeCell(int s,int e)
{
start = s;
end = e;
}
};
vector<TimeCell>timecell;
bool cmp(const TimeCell& a, const TimeCell& b)
{
if (a.end != b.end) return a.end < b.end;
else return a.start > b.start;
}
int main()
{
int n, counter = 0;
cin >> n;
int tema, temb;
for (int i = 0; i < n; i++)
{
cin >> tema >> temb;
timecell.push_back(TimeCell(tema, temb));
}
sort(timecell.begin(), timecell.end(), cmp);
int curlast = timecell[0].end;
counter++;
for (int i = 1; i < timecell.size(); i++)
{
if (curlast < timecell[i].start)
{
curlast = timecell[i].end;
counter++;
}
}
cout << counter << endl;
return 0;
}