校招笔试题-玩转南美馆

校招笔试题-玩转世博南美馆

原题描述:

世博会期间,小明计划玩遍所有南美国家馆,南美共有10个国家,按顺序编号分别为0-9.
小明的游玩方案是这样的:
若玩的人太多,就把馆分成两批,分的方式是在相邻的某两馆之间插一个牌子:任选其中一批先玩,另一批后玩;
若一批馆还是玩不玩,则继续分为两批,且一批中的馆全部玩完之后才能玩下一批馆;
每批馆玩的时候,只能从这批当中编号最小的馆开始,按照相邻的编号逐个玩,一天至少可以玩一个馆。
十个馆玩遍之后,小明拿出在是个馆盖章的册子,请你根据册子上盖章的顺序,判断小明是否遵循了自己的游玩方案。

输入:0-9十个数字的排列;
输出:符合规则的,输出Yes,不符合规则的,输出No;
样例输入输出:
输入 输出
3287956401 yes
4130279856 no

思路:

就是找出最小的那个,然后把最小的左边的赋值到一个新数组里,右边的也赋值到一个新数组里。然后左边的那个数组要么全大于右边的数组,要么全小于。不可能有其他情况,就这样递归判断

下面是代码实现,自己写的,还望指正


C++代码:

#include <iostream>
#include <sstream>
#include <string>
#include <vector>

using namespace std;

bool check(vector<int>& vec_int);
int depart(vector<int>& vec);
int judge(vector<int>& left,vector<int>& right);

int main()
{
    int result=0;
    vector<int> vec_int;
    string inputstr;//="3287956401";
    cin>>inputstr;
    int strlen=inputstr.length();
    stringstream ss;

    for(int i=0;i<strlen;i++)
    {
        int tmp;
        ss<<inputstr[i];
        ss>>tmp;
        ss.clear();
        vec_int.push_back(tmp);
    }

    result=check(vec_int);
    if(result)
        cout<<"yes"<<endl;
    else cout<<"no"<<endl;
//下面两行是阻止命令窗口闪退    
//    int a;
//    cin>>a;
    return 0;
}

bool check(vector<int>& vec_int)
{
    if(vec_int.size()==1)
        return true;
    int minpos=depart(vec_int);
    vector<int>::iterator iter=vec_int.begin()+minpos;
    vector<int> vec_left;
    vector<int> vec_right;
    if(minpos==0)
        vec_left.push_back(vec_int[0]);
    else vec_left.insert(vec_left.end(),vec_int.begin(),iter);
    if((minpos+1)==vec_int.size())
        vec_right.push_back(vec_int[minpos]);
    else vec_right.insert(vec_right.end(),iter+1,vec_int.end());
    if(judge(vec_left,vec_right))
    {
        if(!check(vec_left))
            return false;
        if(!check(vec_right))
            return false;
    }
    else return false;
    return true;
}

int depart(vector<int>& vec)
{
    int min=vec[0],pos=0;
    for(int j=0;j<vec.size();j++)
    {
        if(vec[j]<=min)
        {
            min=vec[j];
            pos=j;
        }
    }
    return pos;
}

int judge(vector<int>& left,vector<int>& right)
{
    int flag=0;
    for(int i=0;i<left.size();i++)
        for(int j=0;j<right.size();j++)
        {
            if((i==0)&&(j==0))
            {
                if(left[i]>right[j])
                    flag=1;
                else flag=-1;
            }
            if(flag==1)
            {
                if(left[i]>right[j])
                    continue;
                else return 0;
            }
            else if(flag==-1)
            {
                if(left[i]<right[j])
                    continue;
                else return 0;
            }
        }
    return 1;
}
发布了22 篇原创文章 · 获赞 36 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/lc315yuhuofei/article/details/52627563