Week3:サイトの間隔の選択 - ローカル欲

設定値の範囲

タイトル説明
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. 我々は、エンドポイントの範囲を選択し、次に合計ポイント= 1をカウントします。見つけるのは難しいことではありません、この時点での最初のクリックは、そのすべてのセクションがcurlastポイントに、ここで、設定を(私たちはソートしているので)同じエンドポイントは少しになりますとき。
  2. 開始点の範囲は、当社の現在のcurlast前に遭遇した場合には、既に、その範囲内のポイントがあるので間隔後の次の外観は、この時点で、あなたは、関係なく、このセクションをスキップすることはできません。(区間2と区間3として図、我々は点curlastで赤色のままであり、この時間)
  3. 私たちは第二を選択する必要がありますので「セクション6点があるが、」我々は区間6、ちょうどcurlast後の開始点に遭遇し、それがあるとき、curlastポイントを満たすことができないことが判明し、上の読みポイント、我々はまだポイントを終了することを選択しました。このとき、= 2、curlast青色の位置を数えます。
  4. 上読んで、curlastポイントはスキップする前にポイント範囲7を起動します。
  5. 8区間の始点curlastポイントの後、私たちは前の2つの更新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