public class kaldewaij435_jml { static int A[] = new int[] {-42,-3,8,-14,-6,-43,-123,-4,-439,3,2,5,0,-12,2,4,34,-50,-9,-23,-2,-18,-104,-22,-40,-40,-3,-34,0,-11,-11,-3,-43,-99,-66}; public static void main(String args[]) { new kaldewaij435_jml().algoritmo(A.length, A); } /* defino este metodo para facilitar la escritura de condiciones */ //@ ensures \result == ((\num_of int i ; p<=i && i<q ; A[i] > 0) - (\num_of int i ; p<=i && i<q ; A[i] < 0)); /*@ pure @*/ int credit(int p, int q) { int c=0; for (int i = p; i < q; i++) { if (A[i] > 0) c++; if (A[i] < 0) c--; } return c; } void algoritmo(final int N, final int[] A) { //@ assert N >= 0; int x = 0, y = 0, m = 0, n = 0, s = 0, e = 0; //@ maintaining m == (\max int p ; 0 <= p && p <= n ; (\max int q ; p <= q && q <= n ; credit(p, q))) && //@ s == (\max int p ; 0 <= p && p <= n ; credit(p, n)) && //@ 0<=n && n<=N && //@ m == credit(x, y); //@ decreasing N-n; while (n != N) { if (A[n] < 0) { if (s-1 < 0) { s = 0; e = n + 1; } else if (s-1 >= 0) { s = s -1; } } else if (A[n] == 0) { } else if (A[n] > 0) { s = s + 1; } if (m <= s) { m = s; x = e; y = n + 1; } else if (m > s) { } n = n + 1; } //@ assert m == (\max int p ; 0 <= p && p <= N ; (\max int q ; p <= q && q <= N ; credit(p, q))) && //@ m == credit(x,y); } }