Nie jestem pewien, czy nie za późno i czy w ogóle Ci pomogę, ale zwróć uwagę, że dla nieparzystej liczby osób Twój program daje wyniki ok. 2 razy za duże. Na przykład taki test znaleziony na forum SPOJ-a:
2486540 548933
Out: 7.115 548933, a u Ciebie chyba: 14.231. Nie jestem pewien, co do precyzji nie rozumiem tej linijki (wybacz ignorację):P :
dl[i] =(int)log10(w[i])+1;
Ja użyłem po prostu:
cout << fixed <<setprecision(3)<<result1<<result2;
Po zmianie sposobu przeliczania odległości i określania precyzji program mi zaakceptował SPOJ(nie jestem pewien czy konieczna jest zmiana precyzji po prostu nie rozumiem sposobu jaki zastosowałeś, mam małą wiedzę:D).
Tak swoją drogą każde cięcie według zadania powinno mieć długość średnicy, więc chyba nie "od środka".
Nie jestem żadnym ekspertem, ale nienajlepiej wpłynęły na czytelność i na wydajność te tablice(sądząc po czasie wykonania programu). Wynik to może być jedna zmienna nadpisywana nowa wartością w każdym obrocie pętli.