您的位置:首页 > 其它

校招笔试题-玩转南美馆

2016-09-22 20:57 288 查看

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

原题描述:

世博会期间,小明计划玩遍所有南美国家馆,南美共有10个国家,按顺序编号分别为0-9.

小明的游玩方案是这样的:

若玩的人太多,就把馆分成两批,分的方式是在相邻的某两馆之间插一个牌子:任选其中一批先玩,另一批后玩;

若一批馆还是玩不玩,则继续分为两批,且一批中的馆全部玩完之后才能玩下一批馆;

每批馆玩的时候,只能从这批当中编号最小的馆开始,按照相邻的编号逐个玩,一天至少可以玩一个馆。

十个馆玩遍之后,小明拿出在是个馆盖章的册子,请你根据册子上盖章的顺序,判断小明是否遵循了自己的游玩方案。

输入:0-9十个数字的排列;

输出:符合规则的,输出Yes,不符合规则的,输出No;

样例输入输出:

输入输出
3287956401yes
4130279856no

思路:

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

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

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息