Teka-teki Pembohong

Saya telah mencoba memecahkan teka-teki di Interviewstreet. Tapi saya belum tahu masalahnya sekarang. Akan sangat bagus jika seseorang bisa memberi saya petunjuk.

Teka-tekinya adalah: Anda memiliki N tentara yang diberi nomor dari 1 sampai N. Masing-masing prajurit Anda adalah pembohong atau orang yang jujur. Anda memiliki M set informasi tentang mereka. Bentuk informasinya adalah sebagai berikut:

Setiap baris berisi 3 bilangan bulat - A, B dan C. Artinya dalam himpunan prajurit yang diberi nomor {A, A+1, A+2, ..., B}, tepatnya C di antaranya adalah pembohong. Ada garis M seperti di atas.

Misalkan L adalah jumlah total prajurit pembohong Anda. Karena Anda tidak dapat menemukan nilai pasti dari L, Anda perlu mencari nilai minimum dan maksimum dari L.

Memasukkan:

Baris pertama masukan berisi dua bilangan bulat N dan M. Masing-masing M baris berikutnya berisi tiga bilangan bulat - A, B, dan C (1 ‹= Ai ‹= Bi ‹= n) dan (0 ‹= Ci ‹= Bi-Ai ). dimana Ai, B i dan C i mengacu pada nilai A, B dan C pada baris ke i masing-masing N dan M tidak lebih dari 101, dan dijamin informasi yang diberikan dapat memuaskan. Anda selalu dapat menemukan situasi yang memenuhi informasi yang diberikan.

Keluaran:

Cetak dua bilangan bulat Lmin dan Lmax ke output.

Contoh Masukan

3 2
1 2 1
2 3 1

Contoh Keluaran

1 2

Contoh Masukan

20 11
3 8 4
1 9 6
1 13 9
5 11 5
4 19 12
8 13 5
4 8 4
7 9 2
10 13 3
7 16 7
14 19 4

Contoh Keluaran

13 14

Penjelasan

Pada contoh testcase pertama, baris pertama adalah "3 2", artinya ada 3 tentara dan kita mempunyai dua set informasi. Informasi pertama adalah bahwa dalam himpunan tentara {1, 2} ada satu pembohong dan informasi kedua adalah bahwa dalam himpunan tentara {2,3} lagi-lagi ada satu pembohong. Sekarang ada dua kemungkinan untuk skenario ini: Prajurit nomor 1 dan 3 adalah pembohong atau prajurit nomor 2 adalah pembohong. Jadi jumlah pembohong minimal adalah 1 dan jumlah pembohong maksimal adalah 2. Maka jawabannya adalah 1 2.


person zcb    schedule 07.06.2012    source sumber


Jawaban (4)


Anda dapat dengan mudah merumuskannya sebagai Program Linier Integer. Karena matriks kendala benar-benar unimodular, matriks ini dapat diselesaikan dengan cepat oleh pemecah ILP mana pun.

person Falk Hüffner    schedule 08.06.2012
comment
Terima kasih sobat. Ide Anda bagus tetapi tidak cukup efektif untuk menyelesaikan masalah ini. Saya mencoba menggunakan ide ini tetapi ternyata gagal dalam 6/10 kasus uji. Alasannya adalah pada kasus uji yang gagal tersebut, variabelnya hampir 100 dan banyak di antaranya merupakan variabel bebas. Untuk mendapatkan jumlah pembohong min/maks, saya harus menghitung semua nilai yang mungkin untuk variabel bebas. Jika variabel bebas lebih dari 30 yang berarti saya harus menghitung 2^30(sekitar 10^9), itu akan terlalu lambat. Adakah ide untuk menghindari dilema ini? - person zcb; 09.06.2012
comment
Saya tidak yakin apa yang Anda terapkan. Idenya adalah untuk memberikan masalah tersebut kepada pemecah ILP yang tersedia seperti GLPK atau Coin CBC. Dengan hanya 100 variabel, mereka seharusnya bisa menyelesaikannya dalam waktu sepersekian detik. Jika Anda ingin menerapkannya sendiri, Anda mungkin akan menggunakan algoritma Simplex. - person Falk Hüffner; 09.06.2012
comment
Hai, Falk. Saya kira maksud Anda adalah merumuskan masalah ini dengan program bilangan bulat dan mengendurkan program bilangan bulat ini menjadi program linier. Pemecah ILP efektif untuk program linier. Namun solusinya adalah bilangan pecahan bukan bilangan bulat. Jadi, bagaimana cara menemukan solusi bilangan bulat optimal berdasarkan hasil yang dikembalikan oleh pemecah ILP? - person zcb; 09.06.2012
comment
Karena matriks batasannya sepenuhnya unimodular dan merupakan integral ruas kanan, maka solusi santainya sebenarnya adalah integral. - person Falk Hüffner; 09.06.2012
comment
Wah, saya tidak mengetahui hal ini sebelumnya. Ini berarti teka-teki ini hampir terpecahkan! Bisakah Anda menjelaskan mengapa solusi santai ini merupakan bagian integral atau merekomendasikan beberapa materi untuk menjawab masalah ini? - person zcb; 09.06.2012
comment
Matriks batasan memiliki properti yang berurutan, artinya Anda dapat menyusun kolom-kolom sedemikian rupa sehingga kolom-kolom di setiap barisnya berurutan. Properti yang berurutan menyiratkan unimodularitas total. Ini adalah hasil yang terkenal dari tahun 1950-an bahwa piringan hitam dengan matriks kendala unimodular dan sisi kanan integral mempunyai solusi integral. Sebuah buku yang harus membahas hal ini adalah mis. A. Schrijver: Teori Pemrograman Linier dan Integer. - person Falk Hüffner; 09.06.2012
comment
Sebagai alternatif, diketahui juga bahwa ILP dengan properti yang berurutan dapat dikonversi ke masalah aliran jaringan, yang mungkin memberikan solusi lebih cepat (Anda dapat menemukannya misalnya di Ahuja, Magnanti, dan Orlin: Arus Jaringan: Teori, Algoritma, dan Aplikasi). - person Falk Hüffner; 09.06.2012
comment
sudahkah Anda menemukan solusi ILP? solusi saya lolos 4/10 (gagal 6/10) dengan jawaban yang salah. Dalam solusi saya, variabel bebas disetel ke nol untuk nilai min dan satu untuk nilai maksimal. Bagaimanapun, tes gagal karena jawaban yang salah, bukan kompleksitas waktu/ruang. - person Ivor Prebeg; 25.11.2012

Ini Satu Lagi Masalah Pemrograman Dinamis. Tidak diperlukan heuristik.

Pada setiap i dari 0 hingga n, seberapa jauh Anda memenuhi semua kondisi terbuka saat ini, Anda perlu melacak jumlah minimum dan maksimum pembohong. (Kondisi terbuka berbentuk, "Dari sini ke j saya membutuhkan k pembohong lagi.")

Jika Anda memiliki solusi untuk i, perpindahan ke i+1 dilakukan sebagai berikut untuk setiap solusi parsial yang Anda miliki:

  1. Jatuhkan semua kondisi yang telah Anda capai dan puas.
  2. Add all new conditions for this number. If a new condition conflicts with your existing solution, throw this partial solution away. Here are the rules for conflict between a condition saying that by j you need k liars and by j' you need k' liars with j <= j':
    1. If k < k' there is a conflict. (You can't have more liars by j and then less again by j'.
    2. Jika j' - j < k' - k ada konflik. (Anda tidak dapat menambahkan k' - k pembohong di j' - j tentara.)
    3. Kalau tidak, tidak akan ada konflik.
  3. Jika tidak ada kondisi yang mengatakan bahwa oleh prajurit j Anda perlu menambahkan j-i pembohong, Anda dapat menambahkan untuk langkah saat ini solusi parsial dengan prajurit saat ini tidak menjadi pembohong. (Yang saya maksud dengan "tambahkan" di sini adalah "pastikan status ini terlacak, dan perbarui maks/mnt sesuai kebutuhan jika tidak terlacak".)
  4. Jika tidak ada kondisi yang mengatakan 0 prajurit tambahan pada titik mendatang, Anda dapat menambahkan solusi parsial untuk langkah saat ini dengan prajurit saat ini menjadi pembohong. (Dalam solusi ini pertama-tama ubah keadaan untuk mengatakan bahwa setiap kondisi membutuhkan lebih sedikit pembohong - karena Anda menambahkan satu, lalu lanjutkan seperti sebelumnya.)

Syarat awal Anda adalah dengan i = 0, ada 1 solusi dengan 0 pembohong dan sama sekali tidak ada syarat.

Dari solusi untuk 0 mulailah membuat solusi parsial untuk 1, 2, ... , n. Dan ketika Anda mencapai n Anda sudah mendapatkan jawabannya.

(Perhatikan, dengan sedikit modifikasi, Anda tidak hanya dapat mengetahui berapa nilai maksimum dan minimumnya, namun juga berapa banyak solusi yang ada.)

person btilly    schedule 07.06.2012
comment
Hai! Terima kasih untuk balasan Anda! Saya kira menggunakan DP adalah cara yang benar. Saya mencoba menerapkannya sekarang. - person zcb; 08.06.2012

Anda bisa mencapai 90% perjalanan ke sana dengan menggunakan prinsip-prinsip berikut:

  1. Jika jumlah pembohong dalam suatu himpunan sama dengan nol, bagilah himpunan tersebut menjadi himpunan berukuran 1, yang masing-masing mempunyai jumlah pembohong sama dengan nol. Jadi 1 3 0 menjadi 1 1 0 dan 2 2 0 dan 3 3 0.

  2. Jika banyaknya pembohong dalam suatu himpunan sama dengan besarnya himpunan tersebut, bagilah himpunan tersebut menjadi himpunan berukuran 1 yang masing-masing mempunyai jumlah pembohong sama dengan satu. Jadi 2 5 4 menjadi 2 2 1 dan 3 3 1 dan 4 4 1 dan 5 5 1.

  3. Untuk dua himpunan A dan B yang kita punya, jika A adalah himpunan bagian dari B, hilangkan semua elemen A dari B, dan kurangi jumlah pembohong di A dari jumlah pembohong di B.

Kami akan menggunakan prinsip-prinsip ini untuk menyelesaikan dua contoh soal yang lebih panjang. Mulailah dengan mengambil masukan yang diberikan, dan mengubahnya menjadi kumpulan indeks.

    3 4 5 6 7 8                                         [4]
1 2 3 4 5 6 7 8 9                                       [6]
1 2 3 4 5 6 7 8 9 10 11 12 13                           [9]
        5 6 7 8 9 10 11                                 [5]
      4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19         [12]
              8 9 10 11 12 13                           [5]
      4 5 6 7 8                                         [4]
            7 8 9                                       [2]
                  10 11 12 13                           [3]
            7 8 9 10 11 12 13 14 15 16                  [7]
                              14 15 16 17 18 19         [4]

4 5 6 7 8 adalah bagian dari 3 4 5 6 7 8, jadi kurangi satu dari yang lain.

    3                                                   [1]
1 2 3 4 5 6 7 8 9                                       [6]
1 2 3 4 5 6 7 8 9 10 11 12 13                           [9]
        5 6 7 8 9 10 11                                 [5]
      4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19         [12]
              8 9 10 11 12 13                           [5]
      4 5 6 7 8                                         [4]
            7 8 9                                       [2]
                  10 11 12 13                           [3]
            7 8 9 10 11 12 13 14 15 16                  [7]
                              14 15 16 17 18 19         [4]

7 8 9, 10 11 12 13, dan 14 15 16 17 18 19 semuanya merupakan himpunan bagian dari 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19, jadi kurangi keduanya.

    3                                                   [1]
1 2 3 4 5 6 7 8 9                                       [6]
1 2 3 4 5 6 7 8 9 10 11 12 13                           [9]
        5 6 7 8 9 10 11                                 [5]
      4 5 6                                             [3]
              8 9 10 11 12 13                           [5]
      4 5 6 7 8                                         [4]
            7 8 9                                       [2]
                  10 11 12 13                           [3]
            7 8 9 10 11 12 13 14 15 16                  [7]
                              14 15 16 17 18 19         [4]

4 5 6 memiliki tiga pembohong, jadi bagilah mereka menjadi beberapa set.

    3                                                   [1]
      4                                                 [1]
        5                                               [1]
          6                                             [1]
1 2 3 4 5 6 7 8 9                                       [6]
1 2 3 4 5 6 7 8 9 10 11 12 13                           [9]
        5 6 7 8 9 10 11                                 [5]
              8 9 10 11 12 13                           [5]
      4 5 6 7 8                                         [4]
            7 8 9                                       [2]
                  10 11 12 13                           [3]
            7 8 9 10 11 12 13 14 15 16                  [7]
                              14 15 16 17 18 19         [4]

kurangi 3,4,5 dan 6 dari semua himpunan yang memuatnya.

    3                                                   [1]
      4                                                 [1]
        5                                               [1]
          6                                             [1]
1 2         7 8 9                                       [2]
1 2         7 8 9 10 11 12 13                           [5]
            7 8 9 10 11                                 [3]
              8 9 10 11 12 13                           [5]
            7 8                                         [1]
            7 8 9                                       [2]
                  10 11 12 13                           [3]
            7 8 9 10 11 12 13 14 15 16                  [7]
                              14 15 16 17 18 19         [4]

kurangi 7 8 dari 7 8 9

    3                                                   [1]
      4                                                 [1]
        5                                               [1]
          6                                             [1]
                9                                       [1]
1 2         7 8 9                                       [2]
1 2         7 8 9 10 11 12 13                           [5]
            7 8 9 10 11                                 [3]
              8 9 10 11 12 13                           [5]
            7 8                                         [1]
                  10 11 12 13                           [3]
            7 8 9 10 11 12 13 14 15 16                  [7]
                              14 15 16 17 18 19         [4]

kurangi 9 dari semua himpunan yang memuatnya.

    3                                                   [1]
      4                                                 [1]
        5                                               [1]
          6                                             [1]
                9                                       [1]
1 2         7 8                                         [1]
1 2         7 8   10 11 12 13                           [4]
            7 8   10 11                                 [2]
              8   10 11 12 13                           [4]
            7 8                                         [1]
                  10 11 12 13                           [3]
            7 8   10 11 12 13 14 15 16                  [6]
                              14 15 16 17 18 19         [4]

kurangi 7 8 dari himpunan mana pun yang berisi keduanya.

    3                                                   [1]
      4                                                 [1]
        5                                               [1]
          6                                             [1]
                9                                       [1]
1 2                                                     [0]
1 2               10 11 12 13                           [3]
                  10 11                                 [1]
              8   10 11 12 13                           [4]
            7 8                                         [1]
                  10 11 12 13                           [3]
                  10 11 12 13 14 15 16                  [5]
                              14 15 16 17 18 19         [4]

1 2 memiliki 0 pembohong, jadi bagilah menjadi beberapa set.

1                                                       [0]
  2                                                     [0]
    3                                                   [1]
      4                                                 [1]
        5                                               [1]
          6                                             [1]
                9                                       [1]
1 2               10 11 12 13                           [3]
                  10 11                                 [1]
              8   10 11 12 13                           [4]
            7 8                                         [1]
                  10 11 12 13                           [3]
                  10 11 12 13 14 15 16                  [5]
                              14 15 16 17 18 19         [4]

kurangi 1 dan 2 dari semua himpunan lain yang memuatnya.

1                                                       [0]
  2                                                     [0]
    3                                                   [1]
      4                                                 [1]
        5                                               [1]
          6                                             [1]
                9                                       [1]
                  10 11                                 [1]
              8   10 11 12 13                           [4]
            7 8                                         [1]
                  10 11 12 13                           [3]
                  10 11 12 13 14 15 16                  [5]
                              14 15 16 17 18 19         [4]

kurangi 10 11 dari himpunan mana pun yang berisi keduanya.

1                                                       [0]
  2                                                     [0]
    3                                                   [1]
      4                                                 [1]
        5                                               [1]
          6                                             [1]
                9                                       [1]
                  10 11                                 [1]
              8         12 13                           [3]
            7 8                                         [1]
                        12 13                           [2]
                        12 13 14 15 16                  [4]
                              14 15 16 17 18 19         [4]

8 12 13 memiliki tiga pembohong, jadi bagilah mereka menjadi himpunan tersendiri, dan kurangi dari himpunan lain yang memuatnya.

1                                                       [0]
  2                                                     [0]
    3                                                   [1]
      4                                                 [1]
        5                                               [1]
          6                                             [1]
            7                                           [0]
              8                                         [1]
                9                                       [1]
                  10 11                                 [1]
                        12                              [1]
                           13                           [1]
                              14 15 16                  [2]
                              14 15 16 17 18 19         [4]

kurangi 14 15 16 dari 14 15 16 17 18 19.

1                                                       [0]
  2                                                     [0]
    3                                                   [1]
      4                                                 [1]
        5                                               [1]
          6                                             [1]
            7                                           [0]
              8                                         [1]
                9                                       [1]
                  10 11                                 [1]
                        12                              [1]
                           13                           [1]
                              14 15 16                  [2]
                                       17 18 19         [2]

Kumpulan hasil kami semuanya terputus-putus satu sama lain. Jika kita menyatukannya, seperti ini:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19         [13]

kita lihat banyaknya pembohong dari 1 sampai 19 adalah 13.

Teknik ini tidak sepenuhnya menyelesaikan masalah di semua kasus. Misalnya, dalam dua contoh masukan yang lebih pendek, teknik ini benar-benar tidak menghasilkan apa-apa. Namun, untuk masalah yang lebih besar, hal ini akan menguraikan set Anda menjadi bentuk yang lebih modular, yang menurut saya akan membuat brute force lebih mudah/lebih cepat. Misalnya, dalam sampel yang lebih besar, kami telah menguraikan ruang masalah menjadi dua kemungkinan:

1. there are 13 liars among soldiers 1-19, and Soldier 20 is not a liar.
2. there are 13 liars among soldiers 1-19, Soldier 20 is a liar.

Kita dapat dengan mudah mengevaluasi kedua kasus ini untuk menentukan bahwa jumlah pembohong minimum adalah 13, dan maksimum adalah 14. Ini jauh lebih cepat daripada mencoba semua 2^20 kombinasi pembohong dan tidak pembohong.

person Kevin    schedule 07.06.2012
comment
Solusi yang sangat bagus dengan tangan. Tapi di mana Anda akan berada jika mereka menurunkan separuh kondisinya? Sebuah program yang masuk ke test suite harus mampu mengatasinya. - person btilly; 07.06.2012

Oke, bagaimana jika kita mengubah masalah menjadi estimasi probabilitas/distribusi

Hal ini sangat mirip dengan "masalah terbalik" (misalnya menyimpulkan distribusi probabilitas dari rata-rata yang diketahui) yang diselesaikan dengan sangat baik oleh metode seperti MAXENT (Entropi Maksimum) (misalnya http://books.google.gr/books?id=Kk6SyQ0AmjsC&pg=PA35&lpg=PA35&dq=MAXENT+inferensi&sumber=bl&ots=W4kVjXRpe7&sig=IzjnOVT0FQJtIXSkeFssNxolLh4&hl=el&sa=X&ei=nxJkU-LUHMmkPciigZAH&ved=0CGcQ6AEwCDgK#v=onepage&q=MAXENT%20inferensi&f=false)

(ditambah lagi menyenangkan bisa menghubungkan bidang-bidang yang tampaknya aneh dengan realitas fisik yang mendasarinya)

Ilmu burung?? :)

person Nikos M.    schedule 02.05.2014