C++: làm thế nào để giải quyết vấn đề này? Gần hiểu rồi, chỉ kẹt một chút thôi

lập trình


Tôi đang nghiền ngẫm các vấn đề về C++ cho đến khi gặp vấn đề này, điều mà tôi không thể AC sau một thời gian dài (thậm chí không thể vượt qua mẫu). Hãy giúp tôi!

Nông dân John có một nhiệm vụ quan trọng – tìm ra loại cỏ khô nào để mua cho đàn bò của mình.
Nông dân John’s Ncows (2 Để thực hiện được điều này, Nông dân John có thể tổ chức các nhóm tập trung. Một nhóm tập trung bao gồm việc tập hợp tất cả những con bò trong một phạm vi liền kề được đánh số ito j, bao gồm, cùng nhau tham gia một cuộc họp. Nếu có một loại cỏ khô mà hơn một nửa số bò trong nhóm thích thì sau khi nhóm tập trung kết thúc cuộc họp, tất cả các con bò đều thích loại cỏ khô đó. Nếu không có loại cỏ khô đó thì cũng không có con bò nào thay đổi loại cỏ khô mà chúng thích. Ví dụ: trong nhóm tập trung bao gồm 16 con bò, 9 con trở lên sẽ cần có cùng sở thích về cỏ khô để khiến những con bò còn lại chuyển đổi sở thích của chúng cho phù hợp.
Nông dân John muốn biết loại cỏ khô nào có thể được tất cả các con bò yêu thích cùng một lúc. Anh ta chỉ có thể tổ chức một nhóm tập trung tại một thời điểm, nhưng anh ta có thể điều hành nhiều nhóm tập trung nếu cần thiết để khiến tất cả các con bò đều thích cùng một loại cỏ khô.

ĐỊNH DẠNG ĐẦU VÀO:
Số đầu tiên sẽ bao gồm một số nguyên T, biểu thị số lượng trường hợp kiểm thử độc lập (1 Dòng thứ hai gồm N số nguyên, loại cỏ khô h(i) ưa thích của các con bò theo thứ tự.
Đảm bảo rằng tổng N trong tất cả các trường hợp thử nghiệm không vượt quá 2⋅10^5.

ĐỊNH DẠNG ĐẦU RA:
Xuất ra T dòng, mỗi dòng một test.
Nếu có thể đồng thời tạo ra tất cả các con bò thích cùng một loại cỏ khô thì hãy xuất ra tất cả các loại cỏ khô đó theo thứ tự tăng dần. Ngược lại, xuất ra −1. Khi in danh sách các số trên cùng một dòng, hãy phân tách các số liền kề bằng dấu cách và đảm bảo dòng không kết thúc bằng bất kỳ khoảng trắng không liên quan nào.

ĐẦU VÀO MẪU:
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
ĐẦU RA MẪU:
2
-1
1 2
3
-1
Trong đầu vào mẫu có 5 trường hợp thử nghiệm.
Trong trường hợp thử nghiệm đầu tiên, chỉ có thể tạo ra tất cả các con bò giống loại 2. FJ có thể làm điều này bằng cách tiến hành một nhóm tập trung duy nhất với tất cả các con bò.
Trong trường hợp thử nghiệm thứ hai, chúng ta có thể chỉ ra rằng không có con bò nào thay đổi loại cỏ khô mà chúng thích.
Trong trường hợp thử nghiệm thứ ba, có thể làm cho tất cả các con bò đều thích loại 1 bằng cách tiến hành ba nhóm tập trung – đầu tiên là có những con bò từ 1 đến 4 trong một nhóm tập trung, sau đó có những con bò từ 1 đến 5 trong một nhóm tập trung, sau đó là có những con bò từ 1 đến 6 trong một nhóm tập trung. Theo logic tương tự, sử dụng bò từ 3 đến 6, bò từ 2 đến 6, rồi bò từ 1 đến 6, chúng ta có thể tạo ra tất cả các con bò giống loại 2.
Trong trường hợp thử nghiệm thứ tư, có thể làm cho tất cả các con bò đều thích loại 3 bằng cách tiến hành một nhóm tập trung duy nhất với tất cả các con bò.
Trong trường hợp thử nghiệm thứ năm, chúng ta có thể chỉ ra rằng không có con bò nào thay đổi loại cỏ khô mà chúng thích.

ĐIỂM:

* Đầu vào 2: N=2.
* Đầu vào 3-4: N<50.
* Đầu vào 5-6: h(i)
h(i+1) với mọi 1 * Đầu vào 7-15: Không có ràng buộc bổ sung.

Những gì tôi đã thử:

Tôi đã xử lý đoạn mã sau (thậm chí mã này thậm chí còn sai dòng cuối cùng của đầu ra mẫu i/o):

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;
}

Nếu ai có bất kỳ giải pháp hoặc thay đổi nào về mã có thể vượt qua câu hỏi, vui lòng cho tôi biết! Cám ơn bạn rất nhiều!

Giải pháp 1

Biên dịch không có nghĩa là mã của bạn đúng! :cười:
Hãy nghĩ về quá trình phát triển như viết một email: biên dịch thành công có nghĩa là bạn đã viết email bằng ngôn ngữ phù hợp – ví dụ như tiếng Anh, thay vì tiếng Đức – không phải email đó có chứa thông điệp bạn muốn gửi hay không.

Vì vậy, bây giờ bạn bước vào giai đoạn phát triển thứ hai (trên thực tế là giai đoạn thứ tư hoặc thứ năm, nhưng bạn sẽ đến các giai đoạn sớm hơn sau): Kiểm tra và gỡ lỗi.

Bắt đầu bằng cách xem nó làm gì và nó khác với những gì bạn muốn như thế nào. Điều này rất quan trọng vì nó cung cấp cho bạn thông tin về lý do tại sao nó lại làm như vậy. Ví dụ: nếu một chương trình nhằm mục đích cho phép người dùng nhập một số và nhân đôi số đó và in ra câu trả lời, thì nếu đầu vào/đầu ra sẽ như thế này:

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

Sau đó, khá rõ ràng rằng vấn đề nằm ở bit nhân đôi nó – nó không cộng chính nó với chính nó hoặc nhân nó với 2, nó nhân nó với chính nó và trả về bình phương của đầu vào.
Vì vậy, bạn có thể xem mã và rõ ràng là nó ở đâu đó ở đây:

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

Khi bạn đã biết điều gì có thể xảy ra, hãy bắt đầu sử dụng trình gỡ lỗi để tìm hiểu lý do. Đặt điểm dừng trên dòng đầu tiên của phương thức và chạy ứng dụng của bạn. Khi đạt đến điểm dừng, trình gỡ lỗi sẽ dừng và trao quyền kiểm soát cho bạn. Giờ đây, bạn có thể chạy mã theo từng dòng một (được gọi là “một bước”) và xem xét (hoặc thậm chí thay đổi) nội dung biến nếu cần (bạn thậm chí có thể thay đổi mã và thử lại nếu cần).
Hãy suy nghĩ xem mỗi dòng trong mã sẽ làm gì trước khi bạn thực thi nó và so sánh điều đó với những gì nó thực sự làm khi bạn sử dụng nút “Bước qua” để thực hiện lần lượt từng dòng. Nó có làm được điều bạn mong đợi không? Nếu vậy, hãy chuyển sang dòng tiếp theo.
Nếu không, tai sao không? Nó khác nhau như thế nào?
Hy vọng rằng điều đó sẽ giúp bạn xác định phần nào của mã đó có vấn đề và vấn đề là gì.
Đây là một kỹ năng và là một kỹ năng rất đáng để phát triển vì nó giúp ích cho bạn trong thế giới thực cũng như trong quá trình phát triển. Và giống như tất cả các kỹ năng, nó chỉ được cải thiện khi sử dụng!

コメント

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