[离散化]人潮最多的時段( Interval Partitioning Problem )

範例:人潮最多的時段( Interval Partitioning Problem )

一群訪客參加宴會,我們詢問到每一位訪客的進場時刻與出場時刻,請問宴會現場擠進最多人的時段。

換個角度想,想像會場門口裝著一支監視器。有訪客進入,會場就多一人;有訪客離開,會場就少一人。如此就很容易統計會場人數。遞增的標的是時刻,而不是訪客。

【註:這個技巧在中文網路上暱稱為「離散化」。】

 
  1. struct Guest {int arrival, leave;} g[10];
  2.  
  3. bool cmp(const int& i, const int& j)
  4. {
  5.     return abs(i) < abs(j);
  6. }
  7.  
  8. void maximum_guest()
  9. {
  10.     vector<int> time;
  11.     for (int i=0; i<10; ++i)
  12.     {
  13.         time.push_back(+g[i].arrival);
  14.         time.push_back(-g[i].leave);
  15.     }
  16.  
  17.     sort(time.begin(), time.end(), cmp);
  18.  
  19.     int n = 0, maximum = 0;
  20.     for (int i=0; i<time.size(); ++i)
  21.     {
  22.         if (time[i] >= 0)
  23.             n++;
  24.         else
  25.             n--;
  26.  
  27.         maximum = max(maximum, n);
  28.     }
  29.     cout << "人潮最多的時段有" << maximum << "人";
  30. }

此處僅找出人數。找出人潮最多的時段,就留給各位自行嘗試吧。

UVa 688 972 10613 10585 10963

UVa 308 837

参考:usaco 1.2.1 注意地点:某时刻同时有人来与人走

posted @ 2015-10-21 19:19  Mose  阅读(600)  评论(0编辑  收藏  举报