C++: bagaimana mengatasi masalah ini? Hampir sampai, hanya macet sedikit

pemrograman

[ad_1]

Saya sedang mengerjakan masalah C++ sampai saya menemukan yang ini, yang tidak dapat saya AC setelah waktu yang lama (bahkan tidak dapat meneruskan sampel). Tolong bantu!

Petani John mempunyai tugas penting – mencari tahu jenis jerami apa yang akan dibeli untuk sapinya.
Sapi milik Peternak John (2≤N≤10^5) diberi nomor 1 sampai Nan dan setiap sapi menyukai tepat satu jenis jerami h(i): (1≤h(i)≤N. Dia ingin semua sapinya menyukai jenis yang sama dari jerami.
Untuk mewujudkan hal ini, Petani John dapat mengadakan kelompok fokus. Kelompok fokus terdiri dari mengumpulkan semua sapi dalam rentang yang berdekatan, bernomor ito j, inklusif, untuk sebuah pertemuan. Jika ada jenis jerami yang disukai oleh lebih dari separuh sapi dalam kelompok, maka setelah diskusi kelompok terfokus selesai, semua sapi pada akhirnya menyukai jenis jerami tersebut. Jika tidak ada jenis jerami seperti itu, maka tidak ada sapi yang mengubah jenis jerami yang mereka sukai. Misalnya, dalam kelompok fokus yang terdiri dari 16 ekor sapi, 9 ekor sapi atau lebih harus memiliki preferensi jerami yang sama agar sapi-sapi yang tersisa mengubah preferensi mereka ke jenis jerami yang sama.
Petani John ingin mengetahui jenis jerami apa yang disukai semua sapi secara bersamaan. Ia hanya dapat menyelenggarakan satu kelompok fokus dalam satu waktu, namun ia dapat menjalankan kelompok fokus sebanyak yang diperlukan agar semua sapi menyukai jenis jerami yang sama.

MASUKKAN FORMAT:
Yang pertama akan terdiri dari bilangan bulat T, yang menunjukkan jumlah kasus uji independen (1≤T≤10)

Baris pertama setiap test case terdiri dari N.
Baris kedua terdiri dari N bilangan bulat, jenis jerami favorit h(i) untuk sapi secara berurutan.
Dijamin bahwa jumlah N pada semua kasus uji tidak melebihi 2⋅10^5.

FORMAT OUTPUT:
Output T baris, satu baris per kasus uji.
Jika memungkinkan untuk membuat semua sapi menyukai jenis jerami yang sama secara bersamaan, keluarkan semua kemungkinan jenis jerami tersebut dalam urutan yang meningkat. Jika tidak, keluaran −1. Saat mencetak daftar nomor pada baris yang sama, pisahkan nomor yang berdekatan dengan spasi, dan pastikan baris tersebut tidak diakhiri dengan spasi yang asing.

SAMPEL MASUKAN:
5
5
1 2 2 2 3
6
1 2 3 1 2 3
6
1 1 1 2 2 2
3
3 2 3
2
2 1
KELUARAN SAMPEL:
2
-1
1 2
3
-1
Pada input sampel terdapat 5 kasus uji.
Pada uji kasus pertama, hanya mungkin membuat semua sapi seperti tipe 2. FJ dapat melakukan ini dengan menjalankan satu kelompok fokus dengan semua sapi.
Pada uji kasus kedua, kami dapat menunjukkan bahwa tidak ada sapi yang akan mengubah jenis jerami yang mereka sukai.
Dalam uji kasus ketiga, semua sapi bisa menjadi seperti tipe 1 dengan menjalankan tiga kelompok fokus – pertama dengan memasukkan sapi 1 sampai 4 ke dalam kelompok fokus, kemudian dengan memasukkan sapi 1 sampai 5 ke dalam kelompok fokus, kemudian dengan memasukkan sapi ke dalam kelompok fokus. 1 sampai 6 dalam kelompok fokus. Dengan logika serupa, dengan menggunakan sapi 3 sampai 6, sapi 2 sampai 6, lalu sapi 1 sampai 6, kita bisa membuat semua sapi seperti tipe 2.
Pada uji kasus keempat, semua sapi bisa menjadi seperti tipe 3 dengan menjalankan satu kelompok fokus dengan semua sapi.
Pada uji kasus kelima, kita dapat menunjukkan bahwa tidak ada sapi yang akan mengubah jenis jerami yang mereka sukai.

SKOR:

* Masukan 2: N=2.
* Masukan 3-4: N≤50.
* Input 5-6: h(i)≤h(i+1) untuk semua 1≤i≤N−1.
* Input 7-15: Tidak ada batasan tambahan.

Apa yang saya coba:

Saya telah mengerjakan kode berikut (yang bahkan membuat baris terakhir keluaran sampel i/o salah):

C++
#include<bits/stdc++.h>
using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int T;
    cin >> T;
    while(T--) {
        int N;
        cin >> N;
        vector<int> h(N);
        for(int i=0; i<N; i++) {
            cin >> h[i];
        }

        map<int, int> count;
        for(int i=0; i<N; i++) {
            count[h[i]]++;
        }

        vector<int> possible;
        for(auto &p : count) {
            if(p.second > N/2) {
                possible.push_back(p.first);
            }
        }

        if(possible.empty()) {
            // Check for types of hay liked by exactly half the cows
            for(auto &p : count) {
                if(p.second == N/2) {
                    possible.push_back(p.first);
                }
            }
        }

        if(possible.empty()) {
            cout << -1 << "\n";
        } else {
            sort(possible.begin(), possible.end());
            for(int i=0; i<possible.size(); i++) {
                cout << possible[i] << (i == possible.size()-1 ? "\n" : " ");
            }
        }
    }

    return 0;
}

Jika ada yang punya solusi atau perubahan pada kode yang dapat menjawab pertanyaan tersebut, tolong beri tahu saya! Terima kasih banyak!

Solusi 1

Kompilasi tidak berarti kode Anda benar! :tertawa:
Bayangkan proses pengembangan seperti menulis email: kompilasi berhasil berarti Anda menulis email dalam bahasa yang benar – Inggris, bukan bahasa Jerman misalnya – bukan email tersebut berisi pesan yang ingin Anda kirim.

Jadi sekarang Anda memasuki tahap pengembangan kedua (pada kenyataannya ini adalah tahap keempat atau kelima, tetapi Anda akan sampai pada tahap awal nanti): Pengujian dan Debugging.

Mulailah dengan melihat apa fungsinya, dan apa perbedaannya dari apa yang Anda inginkan. Hal ini penting karena memberi Anda informasi mengapa ia melakukan hal tersebut. Misalnya, jika suatu program dimaksudkan untuk membiarkan pengguna memasukkan angka dan menggandakannya serta mencetak jawabannya, maka input/outputnya seperti ini:

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16

Maka cukup jelas bahwa masalahnya ada pada bit yang menggandakannya – bit tersebut tidak menambahkan dirinya sendiri ke dirinya sendiri, atau mengalikannya dengan 2, melainkan mengalikannya dengan dirinya sendiri dan mengembalikan kuadrat input.
Jadi dengan itu, Anda dapat melihat kodenya dan jelas bahwa kode itu ada di suatu tempat di sini:

C++
int Double(int value)
   {
   return value * value;
   }

Setelah Anda mengetahui apa yang salah, mulailah menggunakan debugger untuk mencari tahu alasannya. Letakkan breakpoint pada baris pertama metode ini, dan jalankan aplikasi Anda. Ketika mencapai breakpoint, debugger akan berhenti, dan menyerahkan kendali kepada Anda. Anda sekarang dapat menjalankan kode Anda baris demi baris (disebut “langkah tunggal”) dan melihat (atau bahkan mengubah) konten variabel seperlunya (Anda bahkan dapat mengubah kode dan mencoba lagi jika perlu).
Pikirkan tentang apa yang harus dilakukan setiap baris dalam kode sebelum Anda menjalankannya, dan bandingkan dengan apa yang sebenarnya dilakukannya saat Anda menggunakan tombol “Langkah” untuk mengeksekusi setiap baris secara bergantian. Apakah itu sesuai dengan harapan Anda? Jika ya, lanjutkan ke baris berikutnya.
Jika tidak, mengapa tidak? Apa bedanya?
Mudah-mudahan, ini dapat membantu Anda menemukan bagian mana dari kode tersebut yang bermasalah, dan apa masalahnya.
Ini adalah keterampilan, dan merupakan salah satu keterampilan yang layak untuk dikembangkan karena membantu Anda di dunia nyata dan juga dalam pengembangan. Dan seperti semua keterampilan, keterampilan ini hanya meningkat jika digunakan!

Solusi 2

Ini dari Kontes Perunggu USACO Januari 2024 yang berlangsung pada tanggal 26 hingga 29 Januari. Perilaku Kontes dan Integritas Akademik,

Mengutip:

Dilarang berkonsultasi mengenai masalah kontes dengan orang lain selain direktur kontes.

Mengutip:

Jangan membagikan informasi teknis atau kode apa pun yang berkaitan dengan kontes saat kontes sedang aktif berjalan.

Mengutip:

PESERTA YANG MELANGGAR SALAH SATU KEBIJAKAN DI ATAS AKAN DILARANG SEUMUR HIDUP DARI SEMUA AKTIVITAS USACO. JANGAN MENIPU — TIDAK ADA KESEMPATAN KEDUA! (Dan dalam praktiknya, tidak ada manfaatnya bagi Anda untuk menyontek dalam kontes USACO; Anda dapat belajar lebih banyak dengan melakukan upaya jujur ​​dalam memecahkan masalah!). Kami sering menindaklanjuti pelanggaran menyontek dengan menghubungi guru atau kepala sekolah siswa; pernah terjadi pengusiran karena hal ini di masa lalu, jadi ketahuilah bahwa konsekuensi dari kecurangan bisa lebih dari sekadar berpartisipasi dalam USACO.

Jelas sekali Anda telah melanggar beberapa aturan, artinya penyelenggara kontes akan segera diberitahu dan akan ada konsekuensinya.

[ad_2]

コメント

タイトルとURLをコピーしました