ZOJ 3721 Final Exam Arrangement 解题报告

题目

题意:

有一些考试,已知开始时间和结束时间,左闭右开,如果考试时间有重叠,则可以安排在同一天。求最少要安排几天,以及方案。

题解:

将时间点排序,从小到大排序,若有考试开始,则加入队列;若有考试结束,则将队列中的全部考试都安排在一天。

//Time:900ms
//Memory:3508KB
//Length:1453B
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string>
#include <vector>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#define DBLE 1e-8
#define PI 3.1415926535898
#define INF 1000000000
#define MAXN 200010
#define MP(x,y) (make_pair((x),(y)))
#define FI first
#define SE second
using namespace std;
bool vi[MAXN];
pair<int,int> pa[MAXN];
int arr[MAXN],top;
int days[MAXN],dtop;
int main()
{
    //freopen("J:\\MyDocument\\Code\\input.txt","r",stdin);
    int n,sum;
    while(scanf("%d",&n)==1)
    {
        int a,b;
        top=0;
        sum=0,dtop=0;
        memset(vi,0,sizeof(vi));
        for(int i=1;i<=n;++i)
        {
            scanf("%d%d",&a,&b);
            pa[top++]=MP(a,i);
            pa[top++]=MP(b,-i);
        }
        sort(pa,pa+top);
        top=0;
        for(int i=0,len=2*n;i<len;++i)
            if(pa[i].SE>0)
                arr[top++]=pa[i].SE,vi[pa[i].SE]=1;
            else    if(vi[-pa[i].SE])
            {
                ++sum;
                for(int j=0;j<top;++j)
                    days[dtop++]=arr[j],vi[arr[j]]=0;
                days[dtop++]=-1;
                top=0;
            }
        printf("%d\n",sum);
        for(int i=0,s=0;i<dtop;++i)
            if(days[i]>0)
                printf("%s%d",s?" ":"",days[i]),s=1;
            else    printf("\n"),s=0;
        printf("\n");
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值