算法题<度度熊就是要第一个出场>

标签: 算法iteratorpairc
1171人阅读 评论(0) 收藏 举报
分类:

题目来源:http://baidu.openjudge.org/round1a/A/

题目图片:http://hiphotos.baidu.com/hustspy222/pic/item/8cf8441a95cad1c863b010807f3e6709c83d514e.jpg



程序:

/**度度熊就是要第一个出场
 * 程序未检测输入数据的合法性
 */
#include <iostream>
#include <map>
#include <vector>
#include <climits>
#include <string>
#include <set>
using namespace std;

int ComputeRank(map<int, map<double, int> > &line_map, int K)
{
    // 判定是否已经是第一个出场
    int num = K;
    map<int, map<double, int> >::iterator iter = line_map.find(num);
    if(iter==line_map.end())
    {
        return num;
    }
    double y = INT_MAX;

    while(true)
    {
        map<double, int>::iterator iter2 = iter->second.begin();
        for(; iter2!=iter->second.end(); ++iter2)
        {
            if(iter2->first < y)
            {
                break;
            }
        }
        if(iter2!=iter->second.end())
        {
            y = iter2->first;
            num = iter2->second;
        }
        else
        {
            return num;
        }

        iter = line_map.find(num);
    }

    return num;
}

bool CanBeFirst(map<int, map<double, int> > &line_map, int K, int N, set<double, greater<int> > &allY)
{
    // 判定是否已经是第一个出场
    int rank = ComputeRank(line_map, K);
    if(rank == 1)
    {
        return true;
    }

    // 如果不是,则添加横线,再判断能否第一个出场
    set<double, greater<int> >::iterator iterY = allY.begin();
    double test = *iterY + 1;

    do
    {
        if(K>1)
        {
            map<int, map<double, int> > tMap = line_map;
            map<int, map<double, int> >::iterator tmpIter = tMap.find(K);
            if(tmpIter == tMap.end())
            {
                map<double, int> tMap1;
                tMap1.insert(make_pair(test, K-1) );
                tMap.insert(make_pair(K, tMap1) );
            }
            else
            {
                tmpIter->second.insert(make_pair(test, K-1));
            }

            rank = ComputeRank(line_map, K);
            if(rank == 1)
            {
                return true;
            }
        }

        if(K<N)
        {
            map<int, map<double, int> > tMap = line_map;
            map<int, map<double, int> >::iterator tmpIter = tMap.find(K);

            if(tmpIter == tMap.end())
            {
                map<double, int> tMap1;
                tMap1.insert(make_pair(test, K+1) );
                tMap.insert(make_pair(K, tMap1) );
            }
            else
            {
                tmpIter->second.insert(make_pair(test, K+1));
            }

            rank = ComputeRank(line_map, K);
            if(rank == 1)
            {
                return true;
            }
        }

        if(iterY == allY.end())
        {
            break;
        }

        test = *iterY;
        ++iterY;
        if(iterY == allY.end())
        {
            test -= 1;
        }
        else
        {
            test += *iterY;
            test /=2;
        }

    }while(true);

    return false;
}

int main()
{

    vector<string> strVec;

    int data_num;
    cin>>data_num;

    for(int i=0; i<data_num; ++i)
    {
        // line_map存放(xl, (y,xr)) 和 (xr, (y,xl))
        map<int, map<double, int> > line_map;
        // allY存放各种可能的高度
        set<double, greater<int> > allY;
        int N, M, K;
        cin>>N>>M>>K;

        for(int j=0; j<M; ++j)
        {
            int xl, xr, y;
            cin>>xl>>xr>>y;
            allY.insert(y);

            map<int, map<double, int> >::iterator iter;
            iter=line_map.find(xl);
            if(iter!=line_map.end())
            {
                iter->second.insert(make_pair(y, xr));
            }
            else
            {
                map<double, int> tmp;
                tmp.insert(make_pair(y, xr));
                line_map.insert(make_pair(xl, tmp) );
            }

            iter=line_map.find(xr);
            if(iter!=line_map.end())
            {
                iter->second.insert(make_pair(y, xl));
            }
            else
            {
                map<double, int> tmp;
                tmp.insert(make_pair(y, xl));
                line_map.insert(make_pair(xr, tmp) );
            }

        }

        if(CanBeFirst(line_map, K, M, allY) )
        {
            strVec.push_back("Yes");
        }
        else
        {
            strVec.push_back("No");
        }

    }

    //输出结果
    for(vector<string>::iterator istr=strVec.begin(); istr!=strVec.end(); ++istr)
    {
        cout<< *istr <<endl;
    }
    return 0;
}



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:582108次
    • 积分:6992
    • 等级:
    • 排名:第3405名
    • 原创:165篇
    • 转载:6篇
    • 译文:0篇
    • 评论:95条
    我的推荐
    博客专栏
    最新评论