01/10/2018, 00:31

Gặp lỗi ở 1 số testcase trong Day 8 của Hackerrank

Hi mọi người,

Tình hình là mình giải 1 Day 8 trong Hackerrank bằng vector nhưng bị lỗi.

Đây là đề bài:


Đây là code của mình: http://codepad.org/ivr2QnAd

int main() {
    int n;
    std::cin >> n;
    std::vector<std::string> arr_name, arr_phone_number;
    for (int i = 0; i < n; ++i) {
        std::string name, phone_number;
        std::cin >> name >> phone_number;
        arr_name.push_back(name);
        arr_phone_number.push_back(phone_number);
    }
    std::string name;
    while (std::cin >> name) {
        bool Check = false;
        for (int i = 0; i < n; ++i) {
            if (name == arr_name.at(i)) {
                std::cout << arr_name.at(i) << "=" << arr_phone_number.at(i) << std::endl;
                Check = true;
                break;
            }
        }
        if (Check == false)
            std::cout << "Not found" << std::endl;
    }   
    return 0;
}

Còn đây là hình ảnh lỗi:

Như đã thấy, code của mình chỉ vượt qua 1 vài testcase, còn mấy testcase kia nó báo Terminated due to timeout.

Còn đây là Input và Expected Output của những testcase bị lỗi:

Test Case #1 : http://bit.ly/2dJ1YCV
Expected Output : http://bit.ly/2dIZSTF

Test Case #2 : http://bit.ly/2es8CjS
Expected Output : http://bit.ly/2egwQM3

Test Case #3 : http://bit.ly/2dXwyX8
Expected Output : http://bit.ly/2eqRjOx

Đó là 3 Test Case mình bị lỗi!
Mọi người giúp mình nhé, xin cảm ơn !

*grab popcorn* viết 02:44 ngày 01/10/2018

Ko phải lỗi mà giải thuật tốn quá nhiều thời gian nên nó ko cho pass đó.

Người bí ẩn viết 02:36 ngày 01/10/2018

Vậy có cách nào cải thiện không anh, ngoại trừ dùng map ra

*grab popcorn* viết 02:44 ngày 01/10/2018

Nếu ko muốn dùng map thì chỉ còn cách cải thiện cách search. :?
Vì mình thấy code chậm là do cách search kia

Người bí ẩn viết 02:37 ngày 01/10/2018

Nếu ko muốn dùng map thì chỉ còn cách cải thiện cách search. :?

Uhm … vậy anh có cách nào làm cái thuật toán search nó nhanh hơn đủ đáp ứng yêu cầu của hackerrank không ?
Chứ em giải thuật hỏng tốt lắm ^^

*grab popcorn* viết 02:44 ngày 01/10/2018

Nhưng tại sao lại ko dùng map cho lẹ ;_;

Muốn nhanh hơn Linear Search nữa thì tìm hiểu Binary Search.
Nhưng nó yêu cầu mảng phải sắp xếp

Nguyễn Xuân Phúc viết 02:38 ngày 01/10/2018

một là dùng map
2 là dùng vector< pair<string, string> >
sort lại rồi tìm kiếm nhị phân
về cơ bản cả 2 đều O(QlogN) nhưng 1 thằng code khỏe 1 thằng code mệt

Người bí ẩn viết 02:36 ngày 01/10/2018

Cảm ơn mọi người nhiều nhé

Người bí ẩn viết 02:36 ngày 01/10/2018

Binary Search.

Mà cho em hỏi string thì dùng Binary search kiểu gì anh ?
Vì thường Binary search em toàn dùng cho số, bây giờ nó là chuỗi nên thấy hơi lạ

Người bí ẩn viết 02:37 ngày 01/10/2018

Đã cải thiện sang Linear Search nhưng vẫn không đủ nhanh như hackerrank yêu cầu

int main() {
   int n;
    std::cin >> n;
    std::vector<std::string> arr_name, arr_phone_number;
    for (int i = 0; i < n; ++i) {
        std::string name, phone_number;
        std::cin >> name >> phone_number;
        arr_name.push_back(name);
        arr_phone_number.push_back(phone_number);
    }
    std::string name;
    while (std::cin >> name) {
        arr_name.push_back(name);
        int a;
        bool Check = false;
        for (int i = 0;; ++i) {
            if (name == arr_name.at(i)) {
                a = i;
                break;
            }
        }
        if (a != n) {
            std::cout << arr_name.at(a) << "=" << arr_phone_number.at(a) << std::endl;
        }
        else {
            std::cout << "Not found" << std::endl;
        }
        arr_name.pop_back();
    }    
    return 0;
}

Chắc phải dùng map quá

viết 02:35 ngày 01/10/2018

linear search thi có cải thiện gì đâu??

binary search cho chuỗi thì cũng ko khác gì số, nếu guess < a[mid] thì cho right = mid, ngược lại thì left = mid rồi cứ thế mà tìm…

C++ có hàm tìm binary search sẵn là std::lower_bound với std::upper_bound. Tìm hiểu 2 hàm này rồi xài cũng được.

Bài liên quan
0