fun higher_or_max(vs, v) =
let fun iterate
(vs,
max) = case vs of
| h
::t
=> if h
>= v
then h
else iterate
(t, Int
.max(max, h
)) in
iterate(tl vs, hd vs)
end
fun compute lst =
let fun sum(vs, height, v) =
case vs of
[] => 0
| h::t => if h=v
then find_pit(h::t)
else (Int
.min(height, v
)-h
) + sum
(t, height, v
) and
find_pit(vs) =
case vs of
h::n::t => if h>n
then sum(n::t, h, higher_or_max(n::t, h))
else find_pit(n::t)
| _ => 0
in
find_pit lst
end
val t1 = [2,5,1,2,3,4,7,7,6]
val t2 = [0,5,0,1,0,2,1,0]
val t3 = [0,0,5,0,4,0,4,0,3]
val t4 = [0,0,5,0,100,0,4,0,3]
val t5 = [0,0,5,0,7,0,10,10,10]
val t6 = [0,0,7,0,3,0,5,0,2]
val c1 = compute(t1) = 10
val c2 = compute(t2) = 5
val c3 = compute(t3) = 11
val c4 = compute(t4) = 5+4+3
val c5 = compute(t5) = 12
val c6 = compute(t6) = 14
ZnVuIGhpZ2hlcl9vcl9tYXgodnMsIHYpID0KIAlsZXQgZnVuIGl0ZXJhdGUodnMsIG1heCkgPSAKCQljYXNlIHZzIG9mCgkJCVtdID0+IG1heAoJCQl8IGg6OnQgPT4gaWYgaCA+PSB2IHRoZW4gaCBlbHNlIGl0ZXJhdGUodCwgSW50Lm1heChtYXgsIGgpKQoJaW4KCQlpdGVyYXRlKHRsIHZzLCBoZCB2cykKCWVuZAoKZnVuIGNvbXB1dGUgbHN0ID0gCglsZXQgZnVuIHN1bSh2cywgaGVpZ2h0LCB2KSA9IAoJCWNhc2UgdnMgb2YgCgkJCVtdID0+IDAKCQkJfCBoOjp0ID0+IGlmIGg9diAKCQkJCQkJdGhlbiBmaW5kX3BpdChoOjp0KSAKCQkJCQkJZWxzZSAoSW50Lm1pbihoZWlnaHQsIHYpLWgpICsgc3VtKHQsIGhlaWdodCwgdikKCWFuZAoJZmluZF9waXQodnMpID0gCgkJY2FzZSB2cyBvZgoJCQloOjpuOjp0ID0+IGlmIGg+biAKCQkJCQkJdGhlbiBzdW0objo6dCwgaCwgaGlnaGVyX29yX21heChuOjp0LCBoKSkKCQkJCQkJZWxzZSBmaW5kX3BpdChuOjp0KQoJCQl8IF8gPT4gMAoJaW4KCQlmaW5kX3BpdCBsc3QKCWVuZAoKCnZhbCB0MSA9IFsyLDUsMSwyLDMsNCw3LDcsNl0KdmFsIHQyID0gWzAsNSwwLDEsMCwyLDEsMF0KdmFsIHQzID0gWzAsMCw1LDAsNCwwLDQsMCwzXQp2YWwgdDQgPSBbMCwwLDUsMCwxMDAsMCw0LDAsM10KdmFsIHQ1ID0gWzAsMCw1LDAsNywwLDEwLDEwLDEwXQp2YWwgdDYgPSBbMCwwLDcsMCwzLDAsNSwwLDJdCgp2YWwgYzEgPSBjb21wdXRlKHQxKSA9IDEwCnZhbCBjMiA9IGNvbXB1dGUodDIpID0gNQp2YWwgYzMgPSBjb21wdXRlKHQzKSA9IDExCnZhbCBjNCA9IGNvbXB1dGUodDQpID0gNSs0KzMKdmFsIGM1ID0gY29tcHV0ZSh0NSkgPSAxMgp2YWwgYzYgPSBjb21wdXRlKHQ2KSA9IDE0Cg==