关闭

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

标签: 算法iteratorpairc
1275人阅读 评论(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
查看评论

趣题1:度度熊就是要第一个出场

百度年会安排了一场时装秀节目。N名员工将依次身穿盛装上台表演。表演的顺序是通过一种“画线”抽签的方式决定的。首先,员工们在一张白纸上画下N条平行的竖线。在竖线的上方从左到右依次写下1至N代表员工的编号;在竖线的下方也从左到右依次写下1至N代表出场表演的次序: 接着,员工们随意在...
  • pritry
  • pritry
  • 2012-06-21 15:21
  • 788

编程题(度度熊回家最短距离)

一个数轴上共有N个点,第一个点的坐标是度度熊现在位置,第N-1个点是度度熊的家。现在他需要依次的从0号坐标走到N-1号坐标。 但是除了0号坐标和N-1号坐标,他可以在其余的N-2个坐标中选出一个点,并直接将这个点忽略掉,问度度熊回家至少走多少距离? 输入描述: 输入一个正整数N,...
  • lemisi
  • lemisi
  • 2017-07-25 18:00
  • 388

BZOJ 2844 albus就是要第一个出场 高斯消元

题目大意:给定一个n个数的集合S和一个数x,求x在S的2^n个子集从大到小的异或和序列中最早出现的位置 有学长真好不用自己打题目大意了233 首先我们求出线性基 我们会得到一些从大到小排列的数和一堆0 记录0的个数 不考虑0,看前面的数,由于线性基的性质,我们直接贪心从大到小枚举 若当前异或和...
  • PoPoQQQ
  • PoPoQQQ
  • 2014-10-06 16:14
  • 2437

【bzoj 2844】: albus就是要第一个出场

http://www.lydsy.com/JudgeOnline/problem.php?id=2844 先求线性基,那么可以得到0的个数cnt0 每个数与0异或都会得到2^cnt0这个数。。。。 那么从小到大统计答案即可 注意最小的可以是0组成的,所以先要加上2^cnt0个0 ...
  • willinglive
  • willinglive
  • 2015-03-18 20:56
  • 476

【BZOJ2844】albus就是要第一个出场 线性基 高斯消元

题意:需要注意的是空集(0)是天生被包括的,我为了这个WA了好久~拍了好久,醉了好久~ 题解: 首先有一个我并不知道是为什么(甚至不知道它对不对)的性质: 每一种权值会出现2的自由元(n-线性基个数)次方 次。 感性证明: 首先不管重复与否,那么既然是n个数,就会出现2^n个可能相同的权值。...
  • Vmurder
  • Vmurder
  • 2015-02-03 20:38
  • 1302

[编程题] 度度熊回家

时间限制:1秒 空间限制:32768K一个数轴上共有N个点,第一个点的坐标是度度熊现在位置,第N-1个点是度度熊的家。现在他需要依次的从0号坐标走到N-1号坐标。 但是除了0号坐标和N-1号坐标,他可以在其余的N-2个坐标中选出一个点,并直接将这个点忽略掉,问度度熊回家至少走多少距离? 输入描...
  • gpf951101
  • gpf951101
  • 2017-04-29 20:42
  • 1129

【BZOJ 2844】 albus就是要第一个出场

高斯消元好题~
  • Regina8023
  • Regina8023
  • 2015-01-11 12:29
  • 1690

度度熊回家

题目 一个数轴上共有N个点,第一个点的坐标是度度熊现在位置,第N-1个点是度度熊的家。现在他需要依次的从0号坐标走到N-1号坐标。 但是除了0号坐标和N-1号坐标,他可以在其余的N-2个坐标中选出一个点,并直接将这个点忽略掉,问度度熊回家至少走多少距离? 输入 输入一个正整数N, N ...
  • Double2hao
  • Double2hao
  • 2017-05-18 10:57
  • 616

BZOJ 2844 albus就是要第一个出场 高斯消元+线性基

题目大意:给出一个长度为n的正整数数列A。每次选出A的一个子集进行抑或(空集抑或值为0),这样就得到一个长度为2^n的数列B。将B中元素升序排序。给出一个数字m,求m的B中出现的最小位置。 思路:线性基的性质:假设n个数可以消出k个线性基,那么显然会有2^k个不同的亦或和,n个数相互排列显...
  • jiangyuze831
  • jiangyuze831
  • 2015-02-05 09:16
  • 1519

[HDU6119][2017"百度之星"程序设计大赛 - 初赛(B)]小小粉丝度度熊

小小粉丝度度熊 度度熊喜欢着喵哈哈村的大明星——星星小姐。为什么度度熊会喜欢星星小姐呢?首先星星小姐笑起来非常动人,其次星星小姐唱歌也非常好听。但这都不是最重要的,最重要的是,星星小姐拍的一手好代码!于是度度熊关注了星星小姐的贴吧。一开始度度熊决定每天都在星星小姐的贴吧里面签到。但是度度熊是一...
  • UISG103
  • UISG103
  • 2017-08-13 16:59
  • 188
    个人资料
    • 访问:604287次
    • 积分:7751
    • 等级:
    • 排名:第3263名
    • 原创:192篇
    • 转载:6篇
    • 译文:0篇
    • 评论:99条
    博客专栏
    文章分类
    最新评论