Description
每年新学期,计算中心的老师都要安排上机时间。 现设有n个班级E={1, 2, 3, …, n}, 要使用8号机房,同一时间内只允许一个班级使用该机房。设班级i上机的起止时间区间为[si,fi),如果班级i使用了8号机房, 则它在时间[si,fi)内占用该机房,若区间[si,fi)和[sj,fj)不相交,则称班级i和j均可安排上机的。现在要求你安排一下上机情况,使尽可能多的班级能有机会上机。
Input
有多组测试数据。 第1行先输入整数t(1<= t <= 100),表示共有t组测试数据。 每组测试数据输入共有3行, 第1行为一个整数n(1 <= n <= 2000) 表示班级数 第2行共n个整数,为这n个班级希望上机的开始时间(以某一时间为基准) 第3行共n个整数,为这n个班级上机的终止时间
Output
对于每个测试案例输出最多可以安排上机的班级
要用到结构数组,因为每个班的开始与结束时间是需要绑定的
基本思路:贪心算法,排到的班级结束得尽可能早,这样才能使安排的班级更多
#include <stdio.h>
struct time{
int l,r;
};
int main(){
struct time a[2100],temp;
int i,j,k,t,n,index;
scanf("%d",&t);
for(k=0;k<t;k++){
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i].l);
for(i=0;i<n;i++)
scanf("%d",&a[i].r);
for(i=0;i<n-1;i++){
index=i;
for(j=i+1;j<n;j++)
if(a[j].r<a[index].r)
index=j;
temp=a[index];
a[index]=a[i];
a[i]=temp;
}
int count=0,end=0;
for(int i=0;i<n;i++){
if(a[i].l>=end){
end=a[i].r;
count++;}
}
printf("%d\n",count);
}
return 0;
}