校招笔试题-玩转南美馆

来源:互联网 发布:商洛java培训班 编辑:程序博客网 时间:2024/04/30 06:07

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

原题描述:

世博会期间,小明计划玩遍所有南美国家馆,南美共有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;}
1 0