B- 간격 선택된 지점
기술
N과 함께 폐 구간 [A_I, b_i] 수직선. 각 섹션은 적어도 하나의 포인트를 (다른 지점을 포함하는 구간이 동일 할 수있다) 갖도록 몇 점으로 가라. N 및 N 필요한 입력 간격의 수, 선택된 점의 출력
견본
Input
2
1 5
4 6
Output
1
Input
3
1 3
2 5
4 6
Output
2
생각
우선 눌러 오른쪽 경계 상승 부, 동일한 내림차순의 우측 경계의 왼쪽 가장자리. 각 세그먼트에 대한 플래그를 설정하는 플래그는 비트 구간의 오른쪽 경계 지점으로 판단 촬영되지 않은 경우,이 포인트는 시간 간격에 포함되도록 할 수있어서, 판정 순차적 각각의 세그먼트에 대하여 수행 도트 간격이 있는지 여부를 판단 각 간격 이후 그리 디 알고리즘, 및 간격을 반영 수를 최대화 이때도 변경 플래그 직접 스킵 사이클 이후이며, 이러한 간격을 결정한다.
요약
문제는 기본적인 아이디어는 준수 오른쪽 경계 구간 중 점, 최대화 혜택, 그들 뒤에 바로 주문 후, 지점 또는 영역에 조금되지 않은 욕심, 욕심 기준이다 범위 문제 중 하나입니다 또는 왼쪽 여백의 다른 부분보다, 당신은 더 간격이 무시되지 않도록 할 수 있습니다.
코드
#include <iostream>
#include <algorithm>
using namespace std;
int n;
struct time {
int a;
int b;
bool flag = false;
}t[100];
bool compare(time x, time y) {
if (x.b != y.b)return x.b < y.b;
else return x.a > y.a;
}
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
cin >> t[i].a >> t[i].b;
sort(t, t + n, compare);
int count = 0;
int i = 0;
while (i<n) {
if (t[i].flag) {
i++; continue;
}
int b;
if (i < n) { b = t[i].b; count++; t[i].flag = true; i++; }
int index = i;
while (index < n) {
if (t[index].b >= b && t[index].a <= b) {
t[index].flag = true;
index++;
}
else index++;
}
}
printf("%d\n", count);
}