設定値の範囲
タイトル説明
nは閉区間[a_iを、b_i]と対数軸。少なくとも1つの点を有するような、いくつかの点として取る各区間における(ポイントがそれを含む異なる部分であってもよいです)
入力フォーマット
N(N <= 100)の整数の最初の行の
2〜N + 1つのラインの、それぞれ二つの整数、B(B < = 100)
出力フォーマット
選択された点の数を表す整数を
サンプル
入力
2
1 5
4 6
出力
1
入力
3
1 3
2 5
4 6
出力
2
問題解決のためのアイデア
この質問は、部分的な貪欲な戦略を取ります。
入力完了後の各セクションでは、それらを並べ替え:
- 先に小さい方の最後のセクション
- ときに、同じセクションの終わり、より大きな前面のヘッド部
次のセクションは、例えば(図そのような規則に従ってソートされている良い)して説明します。
- 我々は、エンドポイントの範囲を選択し、次に合計ポイント= 1をカウントします。見つけるのは難しいことではありません、この時点での最初のクリックは、そのすべてのセクションがcurlastポイントに、ここで、設定を(私たちはソートしているので)同じエンドポイントは少しになりますとき。
- 開始点の範囲は、当社の現在のcurlast前に遭遇した場合には、既に、その範囲内のポイントがあるので間隔後の次の外観は、この時点で、あなたは、関係なく、このセクションをスキップすることはできません。(区間2と区間3として図、我々は点curlastで赤色のままであり、この時間)
- 私たちは第二を選択する必要がありますので「セクション6点があるが、」我々は区間6、ちょうどcurlast後の開始点に遭遇し、それがあるとき、curlastポイントを満たすことができないことが判明し、上の読みポイント、我々はまだポイントを終了することを選択しました。このとき、= 2、curlast青色の位置を数えます。
- 上読んで、curlastポイントはスキップする前にポイント範囲7を起動します。
- 8区間の始点curlastポイントの後、私たちは前の2つの更新curlastで動作します。今、緑の場所curlast、= 3を数えます。
- 我々は、すべての範囲にわたってトラバースは、エンドコードは、結果は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;
}