Week3 : 사이트의 간격 선택 - 지역 탐욕

설정 값 범위

제목 설명
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. 우리는 엔드 포인트의 범위를 선택한 후, 총 포인트 = 1을 계산합니다. 찾기 어렵지 않다,이 때 첫 번째 클릭은 모든 섹션 curlast 점에 여기, 설정을 (우리가 정렬 때문에) 같은 엔드 포인트가 조금있을 것입니다 때.
  2. 시작 지점의 범위는 현재 curlast 전에 발생하는 경우 이미의 범위 내에서 포인트가 있기 때문에 간격 후 다음 보면,이 시간에, 당신은 상관없이이 부분을 건너 뛸 수 있습니다. (그림 2 절과 3 절로서, 우리는 점 curlast에 빨간 아직이 시간)
  3. 우리가 두 번째를 선택해야하므로 ", 제 6 지점이를"우리가 우리가 간격 6 단지 curlast 후 시작점을 발생하고, 그 때, curlast 점을 충족하지 수 있다는 것을 발견, 읽기 점, 우리는 여전히 점을 최종 선택합니다. 이 때, 파란색 위치 curlast = 2를 계산합니다.
  4. , 읽기 curlast 점은 생략하기 전에 점슛 7을 시작합니다.
  5. 8 구간 시작 지점 curlast 시점 이후, 우리는 이전의 두 업데이트 curlast와 함께 작동합니다. 이제 녹색 장소 curlast = 3을 계산합니다.
  6. 우리는 모든 범위 트래버스는, 종료 코드는, 결과는 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;
}
게시 21 개 원래 기사 · 원의 찬양 3 · 조회수 418

추천

출처blog.csdn.net/qq_44506233/article/details/104702237