| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 526 人关注过本帖
标题:[BNU] 最少的区间
只看楼主 加入收藏
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
结帖率:100%
收藏
 问题点数:0 回复次数:7 
[BNU] 最少的区间
Description

给定n个闭区间  [ai, bi], i=1,2,…,n.  这些区间的并可以用两两不相交的闭区间的并来表示。你的任务是找到这样的两两不相交的闭区间数目最少的表示,且把它们按升序的方式写出。当且仅当a <= b < c <= d时,区间[a, b] 、[c, d]才是升序。
请写程序完成读取区间,然后计算出满足上述条件的两两不相交的区间,并且把找到的区间按升序输出。


Input

输入第一行只有一个数n,3 <= n <= 50000,代表区间数。第i+1行有两个整数ai, bi,之间用一个空格隔开,分别表示区间[ai, bi]的起始和结束(1 <= i <= n),1 <= ai <= bi <= 1000000。
Output

输出应该包含计算出的所有区间,每行写一个区间,每行只有两个数,分别是区间起始和结束,之间用一个空格分开。记住必须是按升序输出。
Sample Input
5
5 6
1 4
10 10
6 9
8 10

Sample Output
1 4
5 10
2011-11-07 12:38
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
faint,我的代码超时。。

程序代码:
#include<iostream>
#include<algorithm>
#include<list>
class Session{
public:
    int low,high;

    Session(){
    }
    Session(int l, int h )
    {
        low = l <= h? l:h;
        high = l <= h? h:l;
        if( low > high)
            std::cerr<<"unsafe"<<std::endl;
    }
    Session(const Session & session)
    {
        low = session.low;
        high = session.high;
    }

    Session & operator = (const Session & session)
    {
        low = session.low;
        high = session.high ;
        if( low > high)
            std::cerr<<"unsafe"<<std::endl;
        return *this;
    }

    bool operator()(Session a, Session b)
    {
        return a.low < b.low;
    }
};

class SessionManager{
    std::list<Session> sessionlist;
    bool merge(Session & a, Session b)
    {
        if ( a.low > b.high || b.low > a.high)
            return false;
        else
        {
            a.low = a.low <= b.low ? a.low : b.low;
            a.high = a.high >= b.high ? a.high: b.high;
        }
        return true;
    }
public:
    SessionManager()
    {
        sessionlist.clear();
    }
    ~SessionManager()
    {
        sessionlist.clear();
    }

    bool insert(Session a)
    {
        bool merged = false;
        Session temp = Session(a);
        for(std::list<Session>::iterator it = sessionlist.begin(); it != sessionlist.end(); it ++)
        {
            if(merge(temp,*it))
            {
                std::list<Session>::iterator pos = it;
                //it++;
                it = sessionlist.erase(pos);
                it--;
                merged = true;
                continue;
            }
        }
        if (! merged)
            sessionlist.push_back(a);
        else
            sessionlist.push_back(temp);
        return false;
    }

    void print()
    {
        sessionlist.sort(Session());
        for( std::list<Session>::iterator it = sessionlist.begin(); it!=sessionlist.end(); it++)
        {
            std::cout<<it->low<<" "<<it->high<<std::endl;
        }
    }
};

int main()
{
    int n;
    std::cin>>n;
    SessionManager manager;
    while(n--)
    {
        int l,h;
        std::cin>>l>>h;
        Session session(l,h);
        manager.insert(session);
    }
    manager.print();
    return 0;
}
2011-11-07 12:40
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
wxjeacen
110071
1029
Accepted
GNU C++
156 ms
1936 KB
976 Bytes
2011-11-07 14:32:31


Pass ....
2011-11-07 14:33
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:0 
为什么不直接调用qsort呢
2011-11-07 16:18
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
以下是引用czz5242199在2011-11-7 16:18:35的发言:

为什么不直接调用qsort呢


有什么区别?
2011-11-07 18:37
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:0 
回复 5楼 Devil_W
哦。你用的就是qsort啊
2011-11-07 21:20
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:0 
其实我一直觉得为什么你写的代码这么。。正式呢,就是感觉像复制的书上的一样,
2011-11-07 21:22
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
以下是引用czz5242199在2011-11-7 21:22:10的发言:

其实我一直觉得为什么你写的代码这么。。正式呢,就是感觉像复制的书上的一样,


你抬举我了,哪本书能写到我这样的代码。
2011-11-07 21:27
快速回复:[BNU] 最少的区间
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015315 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved