설정 값 범위

제목 : 지령치 범위
샤프트 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;
}
게시 15 개 원래 기사 · 원의 칭찬 0 · 조회수 228

추천

출처blog.csdn.net/qq_43653717/article/details/104680401