计算一个酒店的峰值人数。
就是使用两个数代表一个区域,计算一组这样的数中,有多少重合的区域?
原题:http://www.codechef.com/problems/HOTEL/
下面是使用priority_queue的解法。时间效率O(nlgn)。
#include <cstdio>
#include <algorithm>
#include <assert.h>
#include <queue>
using std::sort;
class HotelBytelandia
{
struct twoInt
{
int arri, dep;
bool operator<(const twoInt &t) const
{
return dep > t.dep;
}
};
public:
void run()
{
auto cmp = [](const twoInt &a, const twoInt &b)
{
return a.arri < b.arri;
};
int T;
scanf("%d", &T);
while (T--)
{
int n;
scanf("%d", &n);
if (n < 1)
{
printf("0");
continue;
}
twoInt *A = new twoInt[n];
for (int i = 0; i < n; i++)
{
scanf("%d", &A[i].arri);
}
for (int i = 0; i < n; i++)
{
scanf("%d", &A[i].dep);
}
sort(A, A+n, cmp);
int ans = 1;
std::priority_queue<twoInt> pqt;
pqt.push(A[0]);
for (int i = 1; i < n; i++)
{
while (pqt.size() && A[i].arri >= pqt.top().dep)
{
pqt.pop();
}
pqt.push(A[i]);
ans = std::max(ans, (int)pqt.size());
}
printf("%d\n", ans);
delete [] A;
}
}
};
int hotelBytelandiaRun()
{
HotelBytelandia htb;
htb.run();
return 0;
}