0.In ra độ dài các số 0 liền nhau dài nhất


Submit solution

Points: 2
Time limit: 1.0s
Memory limit: 98M

Author:
Problem type
Allowed languages
Ada, Assembly, Awk, C, C++, C11, CLANG, CLANGX, Classical, COBOL, Coffee, CSC, D lang, DART, F95, FORTH, Fortrn, GAS32, GO, Haskell, Itercal, Java, kotlin, LEAN, LISP, LUA, MONOVB, Nasm, OCAML, Pascal, Perl, php, PIKE, prolog, Pypy, Python, Ruby 2, RUST, Scala, SCM, SED, SWIFT, TCL, TUR, V8JS, VB, ZIG

Viết chương trình nhập vào 1 dãy n số nguyên. In ra độ dài các số 0 liền nhau dài nhất.

Đầu vào:

Dòng đầu tiên là số nguyên n. (\(1 \le n \le {10^5}\)) Dòng thứ 2 là n số nguyên

Đầu ra:

Một số nguyên là độ dài tìm được.

Ví dụ 1:

Input:

6
1 3 0 4 0 0

Output:

2

Ví dụ 2:

Input:

9
0 3 0 0 0 7 0 0 6

Output:

3
Phan Hữu Tuấn

Comments


  • 0
    phanhoangluong_cntt1_k63  commented on Dec. 22, 2022, 1:05 p.m. edited

    sửa lỗi giúp e vs ạ RTE (segmentation fault)

    #include<bits/stdc++.h>
    using namespace std;
    int main(){
        ios_base::sync_with_stdio(false);
        cin.tie(NULL);
        int n,k=0; cin>>n;
        int a[n+10];
        set<int> s;
        for(int i=0;i<n;i++)
            cin>>a[i];
    
        for(int i=0;i<n;i++){
            if(a[i]==0) k++;
            else {
                s.insert(k);
                k=0;
            }
        }
        cout<<*s.rbegin();  
    }

    • 0
      No_Limit  commented on Dec. 22, 2022, 1:36 p.m.

      Trường hợp không có phần tử nào = 0 -> set = nullptr;


  • 1
    3cushin  commented on May 5, 2022, 9:34 a.m. edited
    int main(){
            int n;
            cin>>n;
            int a[100000];
            for(int i=0;i<n;i++){
                cin>>a[i];
            }
            int count = 0;
            int countCurr = 0;
            for(int i=0;i<n;i++){ 
                if(a[i] == 0){
                    countCurr++;
                    if(i==n-1){
                        if(count<countCurr){
                            count = countCurr;
                        }
                    }
                }
                else{
                    if(countCurr>count){
                        count = countCurr;
                        countCurr = 0;
                    }
                }
            }
            cout<<count;
        }

    Cứu em với, không biết sai ở chỗ nào mà cứ sai 1 test case :((


    • 1
      CThành_CNTT6_K61  commented on May 6, 2022, 11:57 a.m.

      xét trường hợp a[i] của em != 0; trong trường hợp biến countCurr của em <= biến count, thì em vẫn phải set cho cái biến đếm số số 0 này về 0


      • 1
        3cushin  commented on May 12, 2022, 4:50 p.m.

        Em làm được rồi, em cảm ơn ạ


  • 1
    3cushin  commented on May 5, 2022, 9:21 a.m. edit 6
    #include<bits/stdc++.h>
    using namespace std;
    
    int main(){
        int n;
        cin>>n;
        int a[100000];
        for(int i=0;i<n;i++){
            cin>>a[i];
        }
        int count = 0;
        int countCurr = 0;
        for(int i=0;i<n;i++){ 
            if(a[i] == 0){
                countCurr++;
                if(i==n-1){
                    if(count<countCurr){
                        count = countCurr;
                    }
                }
            }
            else{
                if(countCurr>count){
                    count = countCurr;
                    countCurr = 0;
                }
            }
        }
        cout<<count;
    }

  • 1
    ga123  commented on Oct. 30, 2021, 8:41 a.m. edit 2

    Để tạm 1 test ở đây để fix:

    5
    0 0 0 0 0

    đã fix xong code, ghi chú thêm:

    • nhớ trường hợp chỉ có số 0 trong dãy.
    • nên sử dụng 1 cấu trúc có thời gian truy xuất nhanh , nhưng lại không cần quan tâm đến thứ tự. trong trường hợp này, stack là lựa chọn hợp lý.
    • chọn đối tượng liên tiếp nên phải liên tục update max và chiều dài tạm thời. Như vậy sẽ tránh được trường hợp bị lỗi, và chỉ cần đưa chiều dài tạm thời về 0 nếu hết sạch chuỗi - hoặc chạm số khác 0.
    #include<iostream>
    #include<stack>
    using namespace std;
    int main()
    {
     ios_base::sync_with_stdio(false);
        cin.tie(NULL);
        cout.tie(NULL);
    stack<int> meo;
    int dem,buff,max=0,i,buff2=0;
    cin>>dem;
    for(i=0;i<dem;i++)
    {
        cin>>buff;
        meo.push(buff);
    }
    while(dem>0)
    {
           //Giải thích đơn giản :
           //trên đỉnh stack là số 0 thì chiều dài tạm thời chuỗi 0 liên tiếp tăng 1.
        if(meo.top()==0)
        {
            buff2++;
            if(buff2>max) max=buff2;//đồng thời kiểm tra giữa max và chiều dài tạm thời chuỗi 0 liên tiếp.
                     //đề phòng trường hợp toàn dãy là số 0.
        }
        if(meo.top()!=0&&buff2!=0)//khác 0 và chiều dài tạm thời chuỗi 0 liên tiếp khác 0
        {
                   //nếu chiều dài tạm thời lớn hơn max thì vẫn phải check.
            if(buff2>max) max=buff2;
                  //vì khác 0 nên biến đếm chiều dài về 0
            buff2=0;
        }
        meo.pop();//cứ kiểm tra xong là vứt luôn.
        dem--;//giảm bớt biến đếm để không lặp vĩnh viễn.
    }
    cout<<max;
    }