Dados un vector de números naturales y una constante , una -segmentación del vector se construye de la siguiente forma: Se comienza desde el primer elemento y se van sumando elementos mientras la suma sea menor o igual que . A continuación se empiezan a restar elementos mientras la suma sea mayor o igual que . A continuación se comienzan a sumar elementos mientras la suma sea menor o igual que y así sucesivamente. El vector es -segmentable si con este proceso se llega al final del vector.
Por ejemplo, el vector es -segmentable porque se puede atravesar todo el vector siguiendo el procedimiento descrito anteriormente como se ve a continuación (donde es la suma):
A: 4 4 1 2 6 7 1 1 8 2 6 7
S: 4 8 9 7 1 8 9 8 0 2 8 1
+ + + - - + + - - + + -
En cambio, el vector no es -segmentable porque si tomamos , nos quedamos parados a medio camino, ya que el 6 no podemos ni sumarlo ni restarlo sin superar o ser negativo:
A: 4 4 1 2 6 7 1 1 8 2 6 7
S: 4 8 7 5
+ + - -
Escriba un programa que encuentre la más pequeña tal que sea -segmentable. Se puede demostrar que siempre existe un valor de tal que .
La entrada consiste en un natural
,
seguido de
naturales A[0], …, A[n-1].
La salida es el mínimo valor de
tal que A es
-segmentable.
Se recomienda utilizar una función:
bool es_segmentable(const vector<int>& A, int k)
que determina si el vector es
-segmentable.
Para diseñar una solución eficiente, conviene pensar en todos aquellos valores de que no hace falta probar.
Input
10 3 1 2 1 4 2 2 1 3 1
Output
5
Input
20 1 2 1 2 1 2 6 1 2 1 2 1 2 1 7 2 1 2 1 2
Output
9
Input
20 1 2 1 2 1 2 6 1 2 1 2 1 2 7 1 2 1 2 1 2
Output
13