行2アルゴリズムのテストの質問のトレーニング

記事ディレクトリ

タイトル

列車列2の
トピックの説明:
列車に乗る乗客はn人で、列車は1から105まで番号が付けられた105の駅を順番に通過します。
私たちは各乗客の乗降場所を知っていますが、これらの乗客の順番はわかりません。乗客が予約すると、まだ空いている座席の中から好きな位置を選択しますが、乗客の好みがわからないため、どの位置を予約したのかはわかりません。
次に、列車が手配する必要のある座席の最小数を計算する必要があります。これにより、予約状況や乗客の順序に関係なく、すべての乗客が座席を確保できます。
たとえば、乗客が3人いる場合:
A:1→2
B:2→3
C:1→3
予約の順序がA、C、Bの場合、2つの座席のみで十分です。Aがチケットを予約したとき、彼は席を選択し、Cがチケットを予約したとき、利用可能な座席は1つだけでした、彼は残りの席を予約しました、Bがチケットを予約したとき、利用可能な座席は1つだけでした、彼はこの席を予約しました(つまり、Aの最初の座席)。予約の順序がA、B、Cの場合、3つの座席が必要になる可能性があります。Aが座席を予約し、BがAとは異なる座席を予約し、Cが予約します彼はチケットの3番目の席しか予約できません。したがって、この一連の例では、答えは3です。

入力
最初の行には、乗客の数を表す整数nが含まれています。
1 <= n <= 1000
次のn行のそれぞれには、i番目の乗客の搭乗駅と搭乗駅を表す2つの整数si、tiが含まれています。
1 <= si <ti <= 105
output
対応する回答を出力します。

サンプル入力
10
84 302
275 327
364 538
26 364であり、
29 386
545 955
715 965
404 415
903 942
150 402
出力例
6

分析

ここに画像の説明を挿入
問題の本質は、重なり合うストロークの最大数を見つけることです。
第10グループと他のグループの旅程が最も一致しています。つまり、10番の旅行のチケットを購入した乗客は、他の5人と同じ旅程を持っています。したがって、最大6シートが必要です。

コードの実装

プラグコードプラットフォームのAC。
次のコードにも最適化の余地があり、交差したトリップを記録してisIntersect()、関数判断の数を減らすことができます。

#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
typedef long long int64;


bool isIntersect(int l1, int r1, int l2, int r2){
	if(r1<=l2 || r2<=l1){
		return false;
	}else{
		return true;
	}
}

//找到最大重叠的区间。
int solve(int n, vector<int> &S, vector<int> &T) {
	int ans = 0;
	for (int i=0; i<n; ++i){
		int tmp = 0;
		for (int j=0; j<n; ++j){
			if(j==i) continue;
			if(isIntersect(S[i], T[i], S[j], T[j])){
				tmp++;
			}
		}
		ans = max(ans, tmp);
	}
	return ans+1;
}

int main() {
	std::ifstream in("in.txt"); std::streambuf *cinbuf = std::cin.rdbuf(); 	std::cin.rdbuf(in.rdbuf());

	int n;
	cin >> n;
	vector<int> S, T;
	for (int i = 0; i < n; ++i) {
		int s, t;
		cin >> s >> t;
		S.push_back(s);
		T.push_back(t);
	}
	cout << solve(n, S, T) << endl;

	system("pause");

	return 0;
}
元の記事を58件公開 11 件を獲得 30,000回以上の閲覧

おすすめ

転載: blog.csdn.net/mhywoniu/article/details/105605758