設定値の範囲

タイトル:設定値範囲
シャフトがn閉区間[a_iを、b_i]の数を有する:イタリアこと。少なくとも1つの点を有するような、いくつかの点として取る各区間における(ポイントがそれを含む異なる部分であってもよいです)

入力:
N(N <= 100)の整数の最初の行
2〜N + 1つのラインの、それぞれ二つの整数、B(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