Nhờ giúp đỡ tìm lỗi sai thuật toán của chương trình

Em đang giải 1 bài toán (đề ở dưới) ở trang web lập trình của trường nhưng sau khi tạo chương trình thì chạy thử các bộ test thì ra kết quả đúng nhưng khi đưa lên web thì lại cho kết quả sai. Em không biết code của mình sai thuật toán ở đâu mong nhờ mọi người giúp đỡ

Capture

#include <iostream>

int main(void)
{
    int T,n,m1,m2,m3,d;
    int d1;
    int tmp1, tmp2;
    tmp1 = 0; tmp2 = 0;
    std::cin >> T;
    int S[T];
    for (int a = 0; a < T; a++) S[a] = 0;
    for (int j = 0; j < T; j++)
    {
        std::cin >> n >> m1 >> m2 >> m3 >> d;

        d1 = d;
    
        // Đếm số từ m1 -> 1 và m3 -> n
        for (int i = m1 - 1; i > 0; i--) 
        {
            if (d1 !=0 ) 
            {
                S[j] += 1;
                d1--;
            } 
        }
        d1 = d;
        for (int i = m3 + 1; i <= n; i++)
        {
            if (d1 !=0 ) 
            {
                S[j] += 1;
                d1--;
            } 
        }
    
        d1 = d;
        tmp1 = m1;
        tmp2 = m2;
    
        // Đếm số từ m1 -> m2
        while ((tmp1 + 1) < (tmp2 - 1))
        {
            if (d1 > 0)
            {
                S[j] += 2;
                d1--;
            }
            tmp1++;
            tmp2--;
        }
        if ((tmp1 + 1) == (tmp2 - 1)) S[j] += 1;
    
        // Đếm số từ m2 -> m3
        d1 = d;
        tmp1 = m2;
        tmp2 = m3;

        while ((tmp1 + 1) < (tmp2 - 1))
        {
            if (d1 > 0)
            {
                S[j] += 2;
                d1--;
            }
            tmp1++;
            tmp2--;
        }
        if ((tmp1 + 1) == (tmp2 - 1)) S[j] += 1;
    }
    for (int j = 0; j < T; j++) std::cout << n - S[j] - 3 << std::endl;
}
1 Like

T là số test case mà bạn :sweat:

3 Likes

Do đề nói có bao nhiêu số Test case thì in ra bấy nhiêu S nên mình dùng array S[T] để in ra luôn bạn

1 Like

Phần Output nó không nói rõ in ra từng dòng hay trên 1 dòng nhỉ?
Mà chắc cũng chẳng quan trọng, cin với số thì dấu cách hay xuống dòng đều được mà.

2 Likes
// Ngày 1 (d = 0)
1 |2| 3 4 5 6 7 8 9 10 11 12 |13| 14 |15| 16 17 18 19
   ^                          ^       ^
// Còn lại 16

// Ngày 2 (d = 1)
|1 2 3| 4 5 6 7 8 9 10 11 |12 13 14 15 16| 17 18 19
   ^                          ^     ^
// Còn lại 11

// Ngày 3 (d = 2)
|1 2 3 4| 5 6 7 8 9 10 |11 12 13 14 15 16 17| 18 19
   ^                          ^     ^
// Còn lại 8

Lượng "lây lan" = (1 + 2 * d) * 3 - (lượng "bị nhiễm" trùng nhau).
Theo ví dụ mẫu thì 1315 sẽ “lây” trùng nhau ở 14.

Đây chỉ là đoạn “giảm độ dài” và loại bỏ bớt vòng lặp. Có thể không giải quyết được vấn đề nộp bài bị sai của bạn.
https://repl.it/@SITUVNgcd/GameVirus

3 Likes

Câu này là khả nghi nhất vì chuẩn C++ không có cú pháp này :slight_smile: (với T là biến) trừ gcc.

5 Likes

Bạn không cần phải khai báo mảng với độ dài là T, như vậy rất tốn mem. Bạn có thể viết 1 hàm để chạy hoàn chỉnh 1 bộ input, sau đó dùng hàm đó nhiều lần.

Ví dụ:

void a_test_process() {
    // thực hiện đầy đủ input - thực hiện - output
}

int main() {
    int test_case;
    cin >> test_case;
    for (int i = 0; i < test_case; i++)
        process(); // chạy từng bộ test một
}
3 Likes

Dùng vậy thì hàm sẽ phải nhập - xử lý - in ra mà đề bài muốn nhập 1 lần nhiều test case cùng 1 lúc rồi mới in ra nhiều giá trị chứ không thể nhập - xử lý - in ra rồi lại nhập tiếp test case tiếp theo. Theo suy nghĩ của mình thì là như vậy không biết đúng không :smile:

Cảm ơn bạn nhé mình sẽ test thử xem sao :grin:

Mỗi case là độc lập thì tính tới đâu ra tới đó :slight_smile:

3 Likes

Đề bài không bảo như vậy.

Các case không liên quan đến nhau thì việc input - xử lí - output cũng độc lập.

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