Kiểm tra dãy tăng ngặt

bool almostIncreasingSequence(std::vector<int> sequence) {
    int siz=sequence.size();
    if (siz==1)
    {
        return 1;
    }
    int count=1;
    for (int i=0; i< siz-1; i++)
    {
        if (sequence.at(i) < sequence.at(i+1))
            count++;
    }
    if (count==size-1 || count==size-2)
        return 1;
    else
        return 0;
}

Cho em hỏi với ạ. Đề cho một dãy số và kiểm tra xem liệu nó có trở thành chuỗi tăng khi loại bỏ duy nhất một phần tử hay không. Bài có một cái test như hình nhưng em cứ thấy sai sai. Không biết loại bỏ số nào để thành chuỗi tăng.

Một số test

[1,2,3,4] => true
[4,3,2,1] => false
[1,3,2,1] => false
[1,2,1] => true
[1,3,2] => true
[1,3,2,3] => true
[1,2,1,2] => false
[1,2,1,3] => true
[2,2,2,3] => false :smiley:
[4,5,6,1,2,3] => false (trên)
[2,1,2] => true (thêm case này nữa :shame:)
(mới) [1,2,4,3,5,2,6] => false

tests = zip(inputs, outputs);
judge(tests)(myFunc, OPFunc);
> myFunc() has 9 correct over 9
> OPFunc() WRONG: true MUST BE: false ARG = 1,2,1,2
> OPFunc() has 8 correct over 9
4 Likes

Chính xác là em không hiểu rõ đề luôn ạ… T^T

Đề là “no more than one” tức là khi cần “nhảy” thì phải nhảy qua đúng số. Qua được 9 test hồi nãy là 95% đúng.

3 Likes

[40, 50, 60, 10, 20, 30]
Đề có một cái test như này ạ. Output của nó là “true” nhưng em không hiểu nếu bớt một số thì nó cũng đâu phải là chuỗi tăng ạ.

Tức là code bạn chỉ xét 10 < 20 nhưng ko xét 60 > 20 :sweat_smile:

2 Likes

Em nhìn nhầm mất ạ. :3
Em cảm ơn ạ.:heart:

oops
Sau khi thêm hai test case:

output:

tests += zip([[4,5,6,1,2,3],[2,1,2]],[false,true])
judge(tests)(myFunc, OPFunc)
> myFunc() WRONG: false MUST BE: true ARG = 2,1,2
> myFunc() has 10 correct over 11
> OPFunc() WRONG: true MUST BE: false ARG = 1,2,1,2
> OPFunc() WRONG: true MUST BE: false ARG = 4,5,6,1,2,3
> OPFunc() has 9 correct over 11
3 Likes

Thuật toán của tôi như thế này, mong mn góp ý:

  • So sánh 2 phần từ liền kề của mảng a(từ a[0] -> a[ơength - 1]
  • Mỗi lần số thứ i > i+1 thì biến đếm tăng 1. &lưu lại giá trị index = i;
  • nếu biến đếm >1 sẽ dừng vòng lặp luôn và return false;
  • kết thúc vòng lặp nếu
  • biến đếm = 0 => return true;
  • biến đếm = 1, xét tiếp giá trị của biến index
    nếu index = a.length - 2 => return true //xóa bỏ phần tử cuối cùng
    else thực hiện tiếp
  • so sánh a[index] < a[index+2] // tức là xóa bỏ phần tử a[index+1]
    => return true
    nếu k, so sánh a[index-1] < a[index + 1] // xóa bỏ phần tử a[index]
    => return true
    Cả 2 trường hợp trên đều k đúng => return false
    // bạn chú ý giá trị của index nữa, tránh việc a[index -1], a[index+2] không tồn tại

    Thân,

[1,1,1,…,1,1,1] thì lại không đúng (dòng 2) :slight_smile:

3 Likes

cài này false chứ nhỉ?

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?