Algoritma kesişen disk sayısı hesaplamak için
Aşağıdaki online test ama şimdi kaldırılmış İm sonrası için onun ok umut onun burada bir parçasıydı. StackOverflow akıllı insanlara soruyorum düşündüm cevabı ile mücadele ediyorum. Herhangi bir dili iyi!
2 boyutlu bir uçak, i-th disk gibi N diskleri çekiyoruz N dizisi verilmiş merkezi (0,ı) ve yarıçapı a[i] vardır. K-th disk ve j-inci disk bilgisayar, diyoruz
ve k-inci ve j-inci diskler, en az bir ortak noktası var.
Bir fonksiyon yazın
int number_of_disc_intersections(int[] A);
yukarıda açıklandığı gibi bir dizi N diskleri tanımlayan verilen, kesişen diskleri çift sayı verir. Örneğin, belirli=6 N ve
A[0] = 1
A[1] = 5
A[2] = 2
A[3] = 1
A[4] = 4
A[5] = 0
kesişen disklerin 11 çift vardır:
0th and 1st
0th and 2nd
0th and 4th
1st and 2nd
1st and 3rd
1st and 4th
1st and 5th
2nd and 3rd
2nd and 4th
3rd and 4th
4th and 5th
işlevi 11 dönmelidir. Eğer işlevini kesişen çift sayısı 10,000,000 aşması durumunda -1 ile dönmelidir. İşlevi N 10,000,000 aşmadığını varsayalım.
Bana yardım edecek kimse, bu konuda mümkün lütfen?
CEVAP
Aralığının kavşak [i-A[i], i A[i]]
sayısını bulmak istiyorum.
Sıralanmış bir dizi (X der) i-A[i]
(ayrıca orada 8 ** değerine sahip bazı ekstra boşluk var) içeren korumak.
Şimdi dizi X yürümek, en soldaki aralığı (i.başlayarak e en küçük i-A[i]
).
Geçerli aralığı, aralığı (10* yani *) sağ uç noktaya gidecek yeri görmek ikili bir arama yapın (rütbe olarak adlandırılır). Şimdi sola tüm unsurları kesişen biliyorsun.
Rütbe ile bir sayacı artırmak ve sayısı aralıkları ve öz kavşak çift istemeyiz olarak geçerli Konum (bir dizine varsayarak) çıkarın.
O(nlogn)zamanO(n)boşluk.
Algoritma verilen bir sayıyı bölenleri...
Nasıl kullanmak nasıl benzer iki resim...
Oyun 2048 için en uygun algoritma nedi...
Coca-Cola için algoritma geliştirme ta...
Geçersiz kılınmış bir Sistem için en i...