http://acm.nyist.net/JudgeOnline/problem.php?pid=220
#include<cstdio>
#include<algorithm>
#include<string.h>
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;i<n;i++)
{
int l,r;
scanf("%d%d",&l,&r);
if(l&1) l++;
if(r&1) r++;
if(l>r)
{
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<cstdio>
#include<algorithm>
#include<vector>
#include<cstdlib>
#include<iterator>
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;i<n;i++)
{
scanf("%d",&a);
arr[i].time=a;
arr[i].flag=i&1;
}
qsort(arr,n,sizeof(point),cmp);
int cnt=0,curr=0;
for(int i=0;i<n;i++)
{
if(arr[i].flag) curr--;
else
{
curr++;
}
if((i==n-1||arr[i].time<arr[i+1].time)&&curr>cnt)
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
****************************************************************/