zoukankan      html  css  js  c++  java
  • POJ 3190 Stall Reservations 【区间贪心】

    题目链接

    题意

    给你N个闭区间,求最小的分组数,使得每组中的区间互不相交

    分析

    最开始想的是用取最多不相交区间的办法,不断地取出当前可以作为最多不相交区间的组,取后标记,再不断取,这样可以保证组数最少。但是这样做复杂度是O(N2),而题中数据量是50000,不可取。
    考虑另一种贪心思路:不断取当前可取的左端点最小的区间,如果可以加在当前右端最值最小的组的后面,则加入,否则新开一组放它。
    那么实现的方法,首先不断取左端点最小的区间,显然将所有区间排序。而显然,不断寻找右端点的最小组,维护优先队列即可。

    AC代码

    //POJ 3190 Stall Reservations
    //AC 2016-7-20 22:48:50
    //Greedy
    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    #include <cctype>
    #include <cstdlib>
    #include <cstring>
    #include <vector>
    #include <set>
    #include <string>
    #include <map>
    #include <queue>
    #include <deque>
    #include <list>
    #include <sstream>
    #include <stack>
    using namespace std;
    
    #define cls(x) memset(x,0,sizeof x)
    #define inf(x) memset(x,0x3f,sizeof x)
    #define neg(x) memset(x,-1,sizeof x)
    #define ninf(x) memset(x,0xc0,sizeof x)
    #define st0(x) memset(x,false,sizeof x)
    #define st1(x) memset(x,true,sizeof x)
    #define INF 0x3f3f3f3f
    #define lowbit(x) x&(-x)
    #define bug cout<<"here"<<endl;
    //#define debug
    
    struct ox
    {
        int beg;
        int endd;
        int no;
        bool operator< (const ox &rhs)const
        {
            if(beg==rhs.beg)
                return endd<rhs.endd;
            return beg<rhs.beg;
        }
    }cows[60000];
    
    struct stall
    {
        int right;
        int no;
        bool operator <(const stall &rhs) const
        {
            return right>rhs.right;
        }
        stall(){}
        stall(int r,int nn):right(r),no(nn){}
    };
    
    priority_queue<stall> stalls;
    int in_stall[60000];
    
    int main()
    {
        #ifdef debug
            freopen("E:\Documents\code\input.txt","r",stdin);
            freopen("E:\Documents\code\output.txt","w",stdout);
        #endif
        int N;
        int a,b;
        while(scanf("%d",&N)!=EOF)
        {
            while(stalls.size())
                stalls.pop();
            for(int i=0;i<N;++i)
            {
                scanf("%d %d",&cows[i].beg,&cows[i].endd);
                cows[i].no=i;
            }
            sort(cows,cows+N);
            int cnt=1;
            for(int i=0;i<N;++i)
            {
                if(stalls.empty()||stalls.top().right>=cows[i].beg)
                {
                    stalls.push(stall(cows[i].endd,cnt));
                    in_stall[cows[i].no]=cnt++;
                }
                else
                {
                    stall cur=stalls.top();
                    stalls.pop();
                    cur.right=cows[i].endd;
                    stalls.push(cur);
                    in_stall[cows[i].no]=cur.no;
                }
            }
            printf("%d
    ",stalls.size());
            for(int i=0;i<N;++i)
                printf("%d
    ",in_stall[i]);
        }
    
        return 0;
    }
    
  • 相关阅读:
    暑假第二周总结
    7.18-7.24 第一周周报
    poj 3295 Tautology
    2016多校 #2 1006 Fantasia
    codeforces 698B Fix a Tree
    codeforces 699B Bomb
    HDU 4578(线段树
    CF 600F( 二分图
    hdu 5517 Triple(二维树状数组)
    HDU HDOJ5412(树套树or整体二分
  • 原文地址:https://www.cnblogs.com/DrCarlluo/p/6580612.html
Copyright © 2011-2022 走看看