Computer Arrangement [经典贪心]

原题:http://oj.acm.zstu.edu.cn/JudgeOnline/problem.php?id=2514

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
对于每个测试案例输出最多可以安排上机的班级
Sample Input
1
11
1 3 0 5 3 5 6 8 8 2 12
4 5 6 7 8 9 10 11 12 13 14
Sample Output
4

题解:说是贪心了,所以我们要尽可能多地安排.当安排了第I个班时,如果结束的越早的话,那么就有更多的时间来安排其他班级,贪的就是尽可能多的剩出时间.
#include <bits/stdc++.h>
const int N=2000+5;
using namespace std;
struct arr{
    int l,r;
}a[N];
bool comp(arr a,arr b){
    return a.r<b.r;
}
int main(){
    int t,n;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        for(int i=1;i<=n;i++) scanf("%d",&a[i].l);
        for(int i=1;i<=n;i++) scanf("%d",&a[i].r);
        sort(a+1,a+1+n,comp);
        int ans=0,end=0;
        for(int i=1;i<=n;i++){
            if(a[i].l>=end) end=a[i].r,ans++;
        }
        printf("%d\n",ans);
    }
    return 0;
}
/**************************************************************
    Problem: 2514
    User: 2018330300029
    Language: C++
    Result: Accepted
    Time:56 ms
    Memory:1484 kb
****************************************************************/
posted @ 2019-03-10 23:10  _yjun  阅读(486)  评论(0编辑  收藏  举报