#include<iostream>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
int getMax(vector <int> vec)//求最大值
{
return *max_element(vec.begin(),vec.end());
}
int getMin(vector <int> vec)//求最小值
{
return *min_element(vec.begin(), vec.end());
}
//判断数组vec的元素顺序是否符合小明的游玩策略,每一次都将元素进行二分,如果能够找到一组的最小值比一组的最大值还大,则说明可以这样分批玩,否则
//当前玩耍的顺序是和小明之前的策略不吻合的。
bool judge(vector<int> vec)
{
int len=vec.size();
if (len<=2)
{
return true;
}
int i;
bool state;
for (i = 1; i < len;i++)
{
vector<int> left(vec.begin(), vec.begin() + i);//分成两个数组
vector<int> right(vec.begin()+i, vec.end());
/*
此处是我最初的代码:
for (i = 1; i < len;i++)
{
vector<int> left(vec.begin(), vec.begin() + i);//分成两个数组
vector<int> right(vec.begin()+i, vec.end());
if (getMax(left) < getMin(right) || getMin(left) > getMax(right))
{
if (judge(left) == false)
return false;
if(judge(right) == false)
return false;
}
}
return false;
其中体现了我在递归上犯的错误,首先,我的本意是如果当前数组顺序违反了小明的策略,那就直接回退,并返回false,否则就是默认的符合小明的策略,但是我之前并没有
默认的state值,而且,就算有了默认的state值,也无法返回,因为整个过程当中,我一直没有返回true的情况,所以,在分支判断的时候,我并没有考虑完整,所以,在left和right都没有违反小明的策略的时候,应该返回true。
*/
if (getMax(left) < getMin(right) || getMin(left) > getMax(right))
{
if (judge(left) == false)
return false;
else if(judge(right) == false)
return false;
else
return true;
}
}
return false;
}
int main()
{
vector<int> vec(10);
vector<int>::iterator it;
for (it = vec.begin(); it != vec.end();it++)
{
cin >> *it;
}
bool yes_or_no=true;
yes_or_no = judge(vec);
cout << yes_or_no << endl;
return 0;
}
平时编程很少使用递归,这次一用才发现自己的不足,具体的分析都在代码里面了。