1. 程式人生 > >【 OJ 】 HDOJ1050 18年12月19日19:11 [ 44 ]

【 OJ 】 HDOJ1050 18年12月19日19:11 [ 44 ]

開始我的比較麻煩,最早的思路是模擬,分s,t陣列錄入N個數(錄入讓s小,t大),依次0-N讀取,第一個數算第一批移動,和它不衝突的就一起移動(讀取到的和可以移動的都標記為0),直到所有都是 0,記下模擬的次數。但是比較麻煩的是:假設讀取第一組數,第二組數不衝突,那麼第一組和第二組作為第一批,讀取第三組數字的時候需要判斷是否和 【第一組和第二組】衝突,這個需要打表來記錄,沒有網上這種直接打表後算最大值做法好...因此借鑑了網上思路做了一遍。

網上思路就是:由於整個移動過程的結果就是最大沖突次數,每當從s-t移動時就會途徑一次s-t個房間,因此打表路過一次++一次

移動結束最大的數就是最大沖突次數,就需要分的次數

# include<iostream>
# include<algorithm>
#define NMAX 200
using namespace std;
int s[NMAX], t[NMAX],time[NMAX];
bool Check(int n) {
	int r;
	for (int i = 0,r=s[0]; i < n; i++)
		if (r != s[i])return true;
	return false;
}
int main(void) {
	int T,N;//幾次迴圈
	int Result = 0;
	cin >> T;
	while (T--) {
		Result = 0;
		memset(time, 0, sizeof(time));
		cin >> N;
		for (int i = 0; i < N; i++) {
			cin >> s[i] >> t[i];
			if (s[i] > t[i]) {
				int ti;
				ti = s[i];
				s[i] = t[i];
				t[i] = ti;
			}
		}//錄入移動資料
		int ss, tt;
		for (int i = 0; i < N; i++) {// s<t
			ss = (s[i] - 1) / 2;
			tt = (t[i] - 1) / 2;
			for (; ss <= tt; ss++)
				time[ss]++;
		}
		Result = *max_element(time, time + NMAX);
		cout << Result*10 << endl;
	}
	system("pause");
	return 0;
}