Latar Belakang
The Penataan ulang Ketimpangan adalah ketimpangan yang didasarkan pada menata ulang nomor. Jika saya memiliki dua daftar nomor dengan panjang yang sama, x 0 , x 1 , x 2 ... x n-1 dan y 0 , y 1 , y 2 ... y n-1 dengan panjang yang sama, di mana saya Saya diizinkan untuk mengatur ulang angka dalam daftar, cara untuk memaksimalkan jumlah x 0 y 0 + x 1 y 1 + x 2 y 2 + ... + x n-1 y n-1 adalah dengan menyortir 2 daftar di pesanan tidak menurun.
Baca artikel Wikipedia di sini.
Tugas
Anda akan menulis sebuah program yang mengambil input dari STDIN atau fungsi yang menerima 2 array (atau wadah terkait) nomor (yang memiliki panjang yang sama).
Dengan asumsi Anda menulis fungsi yang menerima 2 array (a dan b), Anda akan menemukan sejumlah cara Anda dapat mengatur ulang angka dalam array kedua (b) untuk memaksimalkan:
a[0]*b[0]+a[1]*b[1]+a[2]*b[2]+...+a[n-1]*b[n-1]
Dalam hal ini, jika array b adalah [1 0 , 2 1 , 2 2 , 3 3 , 3 4 ] (indeks untuk kejelasan),
[1 0 , 2 1 , 2 2 , 3 3 , 3 4 ],
[1 0 , 2 1 , 2 2 , 3 4 , 3 3 ], (tukar keduanya 3)
[1 0 , 2 2 , 2 1 , 3 3 , 3 4 ] (menukar keduanya 2)
[1 0 , 2 2 , 2 1 , 3 4 , 3 3 ] (menukar keduanya 3 dan menukar keduanya 2)
dianggap pengaturan yang berbeda. Array asli, itu sendiri, juga dianggap sebagai penataan ulang yang mungkin jika juga memaksimalkan jumlah.
Untuk input STDIN, Anda dapat mengasumsikan bahwa panjang array disediakan sebelum array (harap sebutkan sehingga Anda menggunakannya), atau bahwa array disediakan pada baris yang berbeda (juga harap sebutkan).
Berikut adalah 4 kemungkinan input (untuk kenyamanan):
5 1 1 2 2 2 1 2 2 3 3 (length before arrays)
1 1 2 2 2 1 2 2 3 3 (the 2 arrays, concatenated)
1 1 2 2 2
1 2 2 3 3 (the 2 arrays on different lines)
5
1 1 2 2 2
1 2 2 3 3 (length before arrays and the 2 arrays on different lines)
Untuk hasil, Anda diizinkan untuk mengembalikan jawaban (jika Anda menulis fungsi) atau mencetak jawaban ke STDOUT. Anda dapat memilih untuk mengeluarkan jawaban mod 10 9 +7 (dari 0 hingga 10 9 +6) jika lebih nyaman.
Kasus Uji (dan penjelasan):
[1 1 2 2 2] [1 2 2 3 3] => 24
2 entri pertama harus 1 dan 2. 3 entri terakhir adalah 2, 3 dan 3. Ada 2 cara untuk mengatur 2 antara 2 entri pertama dan 2 entri terakhir. Di antara 2 entri pertama, ada 2 cara untuk mengaturnya. Di antara 2 entri terakhir, ada 6 cara untuk mengaturnya.
[1 2 3 4 5] [6 7 8 9 10] => 1
Hanya ada 1 cara, yaitu pengaturan yang diberikan dalam array.
[1 1 ... 1 1] [1 1 ... 1 1] (10000 numbers) => 10000! or 531950728
Setiap permutasi yang dimungkinkan dari array kedua adalah valid.
Dennis ' Testcase : Pastebin => 583159312 (mod 1000000007)
Mencetak:
Ini kode-golf, jadi jawaban tersingkat menang.
Dalam hal pengikatan, ikatan akan diputus pada saat pengajuan, mendukung pengajuan sebelumnya.
Perhatikan:
Kontainer mungkin tidak disortir.
Bilangan bulat dalam wadah mungkin nol atau negatif.
Program harus berjalan cukup cepat (paling lama satu jam) untuk array berukuran sedang (sekitar 10.000 panjangnya).
Terinspirasi oleh pertanyaan ini di Mathematics Stack Exchange.
sumber
[. . .]
respons plzJawaban:
CJam,
3026 byteCobalah online di penerjemah CJam .
Ini menyelesaikan test case dalam waktu kurang dari satu detik:
Menjalankannya dalam juru bahasa online harus kurang dari 10 detik.
Algoritma
Hasilnya tidak tergantung pada urutan A , jadi kami dapat menganggapnya diurutkan. Ini berarti bahwa B juga harus diurutkan untuk mendapatkan produk titik maksimal.
Sekarang, jika r 1 , ... r n adalah panjang dari run dari A yang diurutkan , ada ∏r k ! pengaturan ulang yang berbeda dari elemen-elemen A yang masih menghasilkan urutan naik.
Demikian juga, jika s 1 ,… s n adalah panjang run dari B yang diurutkan, ada ks k ! penataan berbeda dari elemen B yang masih menghasilkan urutan naik.
Namun, ini menghitung semua pasangan beberapa kali. Jika kita mengambil pasangan elemen terkait yang disortir A dan diurutkan B dan mendefinisikan t 1 , ... t n sebagai panjang dari lintasan array yang dihasilkan, kt k ! adalah pengganda tersebut.
Jadi, hasil yang diinginkan adalah (∏r k !) × (ks k !) ÷ (∏t k !) .
Kode
sumber
Pyth,
2928 byteCobalah online di Internet Pyth Compiler .
Algoritma
Hasilnya tidak tergantung pada urutan A , jadi kami dapat menganggapnya diurutkan. Ini berarti bahwa B juga harus diurutkan untuk mendapatkan produk titik maksimal.
Sekarang, jika r 1 , ... r n adalah panjang dari run dari A yang diurutkan , ada ∏r k ! pengaturan ulang yang berbeda dari elemen-elemen A yang masih menghasilkan urutan naik.
Demikian juga, jika s 1 ,… s n adalah panjang run dari B yang diurutkan , ada ks k ! penataan berbeda dari elemen B yang masih menghasilkan urutan naik.
Namun, ini menghitung semua pasangan beberapa kali. Jika kita mengambil pasangan elemen terkait yang diurutkan dari A dan diurutkan B dan mendefinisikan t 1 , ... t n sebagai panjang dari lintasan array yang dihasilkan, kt k ! adalah pengganda tersebut.
Jadi, hasil yang diinginkan adalah (∏r k !) × (ks k !) ÷ (∏t k !) .
Kode
Verifikasi
Saya telah membuat 100 kasus uji pseudo-acak panjang 6, yang telah saya pecahkan dengan kode di atas dan pendekatan brute-force ini:
Inilah hasilnya:
Untuk memverifikasi kiriman saya memenuhi persyaratan kecepatan, saya telah menjalankannya dengan test case ini .
sumber
Matlab, 230 byte
Eksekusi
Testcase Dennis:
Output:
sumber
C ++, 503 byte
(hanya untuk bersenang-senang, bahasa non-golf)
Versi tidak disatukan:
sumber