Najdluzszy spojny podciag niemalejący

0

Witam. Napisałem kod na najdluzszy spojny podciag niemalejacy. Jednak jest w nim zly zakres losowania i w pętli porównują sie liczby z poza zakresu. Mógłby ktoś mi pomoc go zmodyfikowac?


#include<iostream>
#include<time.h>
#include<cstdlib>
using namespace std;
int main()
{
    
    int n, a, b;
    cin >> n >> a >> b;
     int *A = new int[n];
    int l = 1;
    int max = 0;
    srand( time( NULL ) );
    for( int i = 0; i < n; i++ )
    {
        A[ i ] = a + rand() %( b - a );
    }
    for( int i = 0; i < n; i++ )
    {
        cout << A[ i ] << " ";
    }
    for( int i = 0; i < n; i++ )
    {
        
        if( A[ i + 1 ] >= A[ i ] )
        {
            l++;
        }
        else l = 1;
        
        if( l > max ) max = l;
        
        
    }
    cout << endl;
    cout << max;
    
    return 0;
    
    
}
2
int A[ n ];

C++ nie ma VLA. Użyj std::vector.


Hehe, "poprawiłeś" VLA na nagie new, bez delete:

int *A = new int[n];

Użyj std::vector. https://dsp.krzaq.cc/post/176/ucze-sie-cxx-kiedy-uzywac-new-i-delete/


A[ i ] = a + rand() %( b - a );

jest w nim zly zakres losowania

Wygląda ok, ale na przyszłość: https://dsp.krzaq.cc/post/180/nie-uzywaj-rand-cxx-ma-random/


    for( int i = 0; i < n; i++ )
    {
 
        if( A[ i + 1 ] >= A[ i ] )

UB, dla i = n - 1 wartość A[i+1] jest nieoznaczona. Iteruj o 1 mniej razy.

0

Mógłbyś sprawdzic?

#include<iostream>
#include<time.h>
#include<cstdlib>
using namespace std;
int main()
{

    int n,a,b;
    cin>>n>>a>>b;
    int *A = new int[n];
    int l=1;
    int max=0;
    srand(time(NULL));
    for(int i=0; i<n; i++)
    {
        A[i]=(rand()%b)+a;
    }
    for(int i=0; i<n; i++)
    {
        cout<<A[i]<<" ";
    }
    for(int i=0; i<n; i++)
    {

        if(A[i]>=A[i-1])
        {
            l++;
        }
        else l=1;
        if(l>max)max=l;


    }
    cout<<endl;
    cout<<max;
delete[]A;
    return 0;


}
1
A[i]=(rand()%b)+a;

dlaczego poprawiłeś na źle?


    for(int i=0; i<n; i++)
    {
 
        if(A[i]>=A[i-1]

A[-1] jaką ma wartość?

0

Teraz poprawnie kod wygląda?

#include<iostream>
#include<time.h>
#include<cstdlib>
using namespace std;
int main()
{
 
    int n,a,b;
    cin>>n>>a>>b;
    int *A = new int[n];
    int l=1;
    int max=0;
    srand(time(NULL));
    for(int i=0; i<n; i++)
    {
        A[ i ] = a + rand() %( b - a );
    }
    for(int i=0; i<n; i++)
    {
        cout<<A[i]<<" ";
    }
    for(int i=0; i<n-1; i++)
    {
 
        if(A[i+1]>=A[i])
        {
            l++;
        }
        else l=1;
        if(l>max)max=l;
 
    }
    cout<<endl;
    cout<<max;
delete[]A;
    return 0;
 
}
0

Na oko wygląda, że jest formalnie poprawne, ale serio, użyj std::vector i <random> :​/

0

Jak wpisuje zakres powiedzmy od 0 do 10 wypisuje mi liczby od 0 do 9, jak to poprawić?

3

Zwiększ przedział losowania o 1. Gdybyś uży​ł <random> to wystarczyłoby ustawić losowanie na uniform_int_distribution<> dis(0, 10);. Ale rozumiem, niektórzy lubią mieć trudniej.

A[ i ] = a + rand() %( b - a + 1 );
0

Dziękuję za pomoc, postaram się poprawić kod tak jak mówisz. Mam jeszcze jedno pytanie czy

for(int i=0; i<n-1; i++)

jest poprawny?

1

Wygląda ok.

1 użytkowników online, w tym zalogowanych: 0, gości: 1