小编Pau*_*ans的帖子

Peak和Flag Codility最新的chellange

我正在尝试解决最新的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)

javascript algorithm

5
推荐指数
2
解决办法
9745
查看次数

如何在运行时使用 array&lt;int,10&gt; 或 array&lt;int,4&gt; ?

我希望我的代码根据运行时值使用数组的短版本或长版本(其中包含更多元素)。

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)

有没有办法编写它(也许将数组复制到向量?)以避免恢复到开始/结束版本?

c++ arrays for-loop stdarray

4
推荐指数
1
解决办法
104
查看次数

标签 统计

algorithm ×1

arrays ×1

c++ ×1

for-loop ×1

javascript ×1

stdarray ×1