タイトル:設定値範囲
シャフトが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;
}