範例:人潮最多的時段( Interval Partitioning Problem )
一群訪客參加宴會,我們詢問到每一位訪客的進場時刻與出場時刻,請問宴會現場擠進最多人的時段。
換個角度想,想像會場門口裝著一支監視器。有訪客進入,會場就多一人;有訪客離開,會場就少一人。如此就很容易統計會場人數。遞增的標的是時刻,而不是訪客。
【註:這個技巧在中文網路上暱稱為「離散化」。】
- struct Guest {int arrival, leave;} g[10];
- bool cmp(const int& i, const int& j)
- {
- return abs(i) < abs(j);
- }
- void maximum_guest()
- {
- vector<int> time;
- for (int i=0; i<10; ++i)
- {
- time.push_back(+g[i].arrival);
- time.push_back(-g[i].leave);
- }
- sort(time.begin(), time.end(), cmp);
- int n = 0, maximum = 0;
- for (int i=0; i<time.size(); ++i)
- {
- if (time[i] >= 0)
- n++;
- else
- n--;
- maximum = max(maximum, n);
- }
- cout << "人潮最多的時段有" << maximum << "人";
- }
此處僅找出人數。找出人潮最多的時段,就留給各位自行嘗試吧。
时间: 2024-10-20 20:45:35