区间最大重叠数

http://acm.nyist.net/JudgeOnline/problem.php?pid=220


#include
#include
#include
using namespace std;
int main(){
    int t;
    scanf("%d",&t);
    while(t--) {
           int n;
           scanf("%d",&n);
           int sum=0;
           int arr[410];
           memset(arr,0,sizeof(arr));
           for(int i=0;ir)
               {
                   l^=r;
                   r^=l;
                   l^=r;
               }
               for(int j=l;j<=r;j++)
               {
                   arr[j]++;
                   sum=max(sum,arr[j]);
               }
           }
           printf("%d\n",sum*10);
    }
    return 0;
}

http://www.scut.edu.cn/oj/ 题号:1924
http://blog.csdn.net/cxllyg/article/details/8200395

假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的贪心算法进行安排。(这个问题实际上是著名的图着色问题。若将每一个活动作为图的一个顶点,不相容活动间用边相连。使相邻顶点着有不同颜色的最小着色数,相应于要找的最小会场数。)
要求:对于给定的k个待安排的活动,编程计算使用最少会场的时间表。

题解:为了有效地对这n个活动进行安排,首先将n个活动区间的2n个端点排序。然后,用扫描算法,从左到右扫描整个直线。在每个事件点处(即活动的开始时刻或结束时刻)作会场安排。当遇到一个开始时刻,就将活动安排在一个空闲的会场中。遇到一个结束时刻,就将活动占用的会场释放到空闲会场栈中,已备使用。经过这样一遍扫描后,最多安排了m个会场(m是最大重叠区间数)。

#include
#include
#include
#include
#include
using namespace std;
struct point{
    int time,flag;
}arr[20010];
int cmp(const void *a,const void * b)
{
    return (*(point*)a).time-(*(point*)b).time;
}
int main(){
   int n,a;
   scanf("%d",&n);
   n<<=1;
   for(int i=0;icnt)
        cnt=curr;
/*处理arr[i]==arr[i+1]的情况.当cur>cnt且arr[i]==arr[i+1]时,i+1时间可能是开始时间,也可能是
结束时间。如果i+1是结束时间,那么i是开始时间,说明某活动开始时间和结束时间相同,不需
要会场,故不对cnt更新;如果i+1是开始时间,那么i是结束时间,也就是说这两个事件是可以用同
一个会场的,那么这两个时间段可以连在一起当作一个时间段,
也就是那在i+1次再更新,可以看出在i+1次更新cnt效果是一样的,因此i次
不进行更新。*/
   }
   printf("%d\n",cnt);
    return 0;
}
 
/**************************************************************
    Problem: 1924
    User: 201530542552
    Language: C++
    Result: Accepted
    Time:12 ms
    Memory:1120 kb
****************************************************************/

你可能感兴趣的:(区间最大重叠数)