SSL-ZYC 活动安排
题目大意:
我们要在足够多的会场里举行各种活动,一个会场在同一时刻只能安排一个活动,希望使用尽可能少的会场总数。假设一个活动结束后,立即可以在这个会场中进行下一个活动。求一段时间中需要的最少会场数。
思路:
纯暴力的题目!
我们可以以开始时间来快排,再从1到n枚举每个活动的时间,求出最少所需的会场数。
时间复杂度:O(n^2)
代码:
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
int a[1001],b[1001],c[1001],sum,n,num;
void sorts(int l,int r)
{
int i,j,z;
i=l;
j=r;
z=a[(i+j)/2];
do
{
while (a[i]<z) i++;
while (a[j]>z) j--;
if (i<=j)
{
swap(a[i],a[j]);
swap(b[i],b[j]);
i++;
j--;
}
}
while (i<=j);
if (i<r) sorts(i,r);
if (j>l) sorts(l,j);
}
int main()
{
freopen("meet.in","r",stdin);
freopen("meet.out","w",stdout);
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d%d",&a[i],&b[i]);
sorts(1,n); //手打快排
sum=1;
c[1]=b[1]; //初始化
for (int i=2;i<=n;i++) //枚举
{
num=0;
for (int j=1;j<=sum;j++)
if (c[j]<=a[i]&&c[j]>c[num]) num=j;
if (num==0) //使用已有会场
{
sum++;
c[sum]=b[i];
}
else //新开一个会场
{
c[num]=b[i];
}
}
printf("%d\n",sum);
return 0;
}