CSES - Listahyppy

Annettuna on lista, jossa on nn alkiota. Jokainen alkio on kokonaisluku väliltä 1n1 \dots n.

Lähdet liikkelle listan alusta, ja aina kun olet alkion xx kohdalla, saat hypätä xx askelta vasemmalle tai oikealle. Et saa kuitenkaan tehdä hyppyä, joka veisi listan ulkopuolelle. Tavoitteesi on päästä listan loppuun niin, että hyppyjen kokonaismatka on mahdollisimman pieni.

Esimerkiksi listassa [3,5,2,2,2,3,5][3,5,2,2,2,3,5] paras ratkaisu on hypätä ensin 33 askelta oikealle, sitten 22 askelta vasemmalle ja lopuksi 55 askelta oikealle. Tässä askelia on yhteensä 3+2+5=103+2+5=10.

Voit olettaa, että nn on enintään 10510^5. Jos mitään ratkaisua ei ole olemassa, palauta 1-1.

Python

Toteuta tiedostoon listjump.py funktio calculate, joka antaa pienimmän kokonaismatkan.

def calculate(t):
    # TODO

if __name__ == "__main__":
    print(calculate([1,1,1,1])) # 3
    print(calculate([3,2,1])) # -1
    print(calculate([3,5,2,2,2,3,5])) # 10
    print(calculate([7,5,3,1,4,2,4,6,1])) # 32

Java

Toteuta tiedostoon ListJump.java metodi calculate, joka antaa pienimmän kokonaismatkan.

public class ListJump {
    public long calculate(int[] t) {
        // TODO
    }

    public static void main(String[] args) {
        ListJump l = new ListJump();
        System.out.println(l.calculate(new int[] {1,1,1,1})); // 3
        System.out.println(l.calculate(new int[] {3,2,1})); // -1
        System.out.println(l.calculate(new int[] {3,5,2,2,2,3,5})); // 10         
        System.out.println(l.calculate(new int[] {7,5,3,1,4,2,4,6,1})); // 32
    }
}