error: reference to ‘left’ is ambiguous|
是和库的变量名重复了,解决方法:修改变量名
试题 算法训练 摆动序列
http://lx.lanqiao.cn/problem.page?gpid=T44
问题描述
如果一个序列满足下面的性质,我们就将它称为摆动序列:
1. 序列中的所有数都是不大于k的正整数;
2. 序列中至少有两个数。
3. 序列中的数两两不相等;
4. 如果第i – 1个数比第i – 2个数大,则第i个数比第i – 2个数小;如果第i – 1个数比第i – 2个数小,则第i个数比第i – 2个数大。
比如,当k = 3时,有下面几个这样的序列:
1 2
1 3
2 1
2 1 3
2 3
2 3 1
3 1
3 2
一共有8种,给定k,请求出满足上面要求的序列的个数。
#include <iostream>
using namespace std;
int k,ans;
int a[100];
bool vis[100]; //标记是否访问
//判断当前点是否满足要求
bool judge(int num, int x) {
if (x == 1 || x == 2)
return true;
if ((a[x - 1] - a[x - 2]) * (num - a[x - 2]) < 0)
return true;
return false;
}
void dfs(int x) {
//大于要求长度则返回
if (x > k)
return;
for (int i = 1; i <= k; ++i) {
if (!vis[i] && judge(i, x)) {
vis[i] = true;
a[x] = i;
//序列必须大于2,才计数
if (x >= 2)
ans++;
dfs(x + 1);
vis[i] = false; //回溯
}
}
}
int main() {
cin >>k;
dfs(1);
cout << ans << endl;
return 0;
}