我正在尝试解决最新的codility.com问题(只是为了提高我的技能).我试过分配,但没有超过30分,所以现在好奇我在解决方案中究竟缺少什么.
问题说
给出了由N个整数组成的非空零索引数组A. 峰值是一个比其邻居更大的数组元素.更确切地说,它是指数P
0 < P < N ? 1 and A[P ? 1] < A[P] > A[P + 1]
Run Code Online (Sandbox Code Playgroud)
例如,以下数组A:
A[0] = 1
A[1] = 5
A[2] = 3
A[3] = 4
A[4] = 3
A[5] = 4
A[6] = 1
A[7] = 2
A[8] = 3
A[9] = 4
A[10] = 6
A[11] = 2
Run Code Online (Sandbox Code Playgroud)
恰好有四个峰:元素1,3,5和10.
您将前往一系列相对高度由阵列A表示的山脉.您必须选择应该带多少旗帜.目标是根据某些规则设置峰值上的最大标志数.
标志只能在峰值上设置.更重要的是,如果你取K标志,那么任何两个标志之间的距离应该大于或等于K.指数P和Q之间的距离是绝对值| P-Q |.
例如,给定由上面的数组A表示的山脉,N = 12,如果你采取:
> two flags, you can set them on peaks 1 and 5;
> three …Run Code Online (Sandbox Code Playgroud) 我希望我的代码根据运行时值使用数组的短版本或长版本(其中包含更多元素)。
constexpr std::array<int, 10> longArray{0,1,2,3,4,5,6,7,8,9};
constexpr std::array<int,4> shortArray{0,3,6,9};
auto const& myArray = useShortArray ? shortArray : longArray;
for( auto n : myArray ) {
// Do the stuff
}
Run Code Online (Sandbox Code Playgroud)
如上所述,有一个错误,因为三元运算符的参数不同。
我怎样才能做到这一点?
唯一的方法是声明两个分配的开始和结束迭代器。但这会导致for在迭代器上使用旧的,并且需要在for块内的每次使用时取消引用迭代器。
auto const& myBegin = useShortArray ? shortArray.begin() : longArray.begin();
auto const& myEnd = useShortArray ? shortArray.end() : longArray.end();
for( auto it = myBegin ; it != myEnd ; ++it ) {
// use *it
}
Run Code Online (Sandbox Code Playgroud)
有没有办法编写它(也许将数组复制到向量?)以避免恢复到开始/结束版本?