C - Stall Reservations 贪心算法

来源:互联网 发布:斑马网络招聘 编辑:程序博客网 时间:2024/05/16 02:59

题意:大致是是将一些不想交的区间合并,问合并之后,这些区间最少的组数。

这道想了好几天,一开始看到这道题目之后,就有了思路,很认真的用了两个循环,并且在过了

测试数据,马上就提交,哎,最担心的TLE还是出现了。

然后就开始在想怎么做这道题,实在想不出来。然后就来到我们学校一位大神的博客。

看到要用优先队列,这对于正在学贪心的算法的我,实在是一个挑战,然后看了看解题报告,才逐渐的开始明白。

这也是我第一次用优先队列做贪心题目。

参考:点击打开链接

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<queue>using namespace std;const int maxn=60000;int n,use[maxn];struct node{    int l;    int r;    int pos;    bool operator <(const node &a)const    {        if(r==a.r)            return l>a.l;        return r>a.r;    }} a[maxn];priority_queue<struct node> q;int cmp(struct node a,struct node b){    if(a.l==b.l)        return a.r<b.r;    return a.l<b.l;}int main(){    int n;    scanf("%d",&n);    for(int i=0;i<n;i++)    {        scanf("%d%d",&a[i].l,&a[i].r);        a[i].pos=i;    }    sort(a,a+n,cmp);    q.push(a[0]);    use[a[0].pos]=1;    int kj=1;    for(int i=1;i<n;i++)    {        if(!q.empty()&&q.top().r<a[i].l)        {            use[a[i].pos]=use[q.top().pos];            q.pop();        }        else        {            kj++;            use[a[i].pos]=kj;        }        q.push(a[i]);    }    printf("%d\n",kj);    for(int i=0;i<n;i++)        printf("%d\n",use[i]);    return 0;}


0 0
原创粉丝点击