C (gcc), 82 byte
n;f(x,y,a,b)int*x,*y;{for(n=0;a;)--b&&*x*2-*y>y[1]?++y:(++b,--a,n+=abs(*x++-*y));}
Ini membutuhkan input sebagai dua array integer dan panjangnya (karena C tidak memiliki cara untuk mendapatkan panjangnya). Ini dapat ditunjukkan untuk dijalankan O(a+b)karena salah satu aatau bdikurangi pada setiap iterasi dari loop, yang berakhir ketika amencapai 0(dan btidak dapat dikurangi di bawah 0).
Cobalah online!
n; // define sum as an integer
f(x,y,a,b) // function taking two arrays and two lengths
int*x,*y; // use k&r style definitions to shorten function declaration
{
for(n=0; // initialize sum to 0
a;) // keep looping until x (the first array) runs out
// we'll decrement a/b every time we increment x/y respectively
--b&& // if y has ≥1 elements left (b>1, but decrements in-place)...
*x*2-*y>y[1]? // ... and x - y > [next y] - x, but rearranged for brevity...
++y: // increment y (we already decremented b earlier);
(++b, // otherwise, undo the in-place decrement of b from before...
--a,n+=abs(*x++-*y)) // decrement a instead, add |x-y| to n, and then increment x
;}
Beberapa catatan:
Alih-alih mengindeks ke dalam array, menambah pointer dan dereferencing secara langsung menghemat byte yang cukup untuk itu layak ( *xvs x[a]dan y[1]vs y[b+1]).
The --b&&Kondisi memeriksa b>1secara tidak langsung - jika bini 1, akan mengevaluasi ke nol. Karena ini memodifikasi b, kita tidak perlu mengubahnya di cabang pertama dari terner (yang maju y), tetapi kita perlu mengubahnya kembali di cabang kedua (yang maju x).
Tidak returndiperlukan pernyataan, karena ilmu hitam. (Saya pikir itu karena pernyataan terakhir yang akan dievaluasi akan selalu berupa n+=...ekspresi, yang menggunakan register yang sama dengan yang digunakan untuk nilai pengembalian.)