프로그램 설계 생각 Week3- 작업 B- 간격을 선택한 점

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);

}


게시 21 개 원래 기사 · 원 찬양 5 · 조회수 785

추천

출처blog.csdn.net/weixin_44578615/article/details/104711970