【 OJ 】 HDOJ1050 18年12月19日19:11 [ 44 ]
阿新 • • 發佈:2018-12-23
開始我的比較麻煩,最早的思路是模擬,分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; }