Професионална програма
Loading...
+ Нов въпрос
Borislav919 avatar Borislav919 1 Точки

02. Longest Sequence

Здравейте. Може ли малко помощ със задачата. С входа и изхода всичко е наред т.е. при задаване на входа от условието изходът излиза също по условие, но judge не ми дава пълният брой точки. Пробвах същата задача с вложен цикъл(за обхождане на масива), също така и кода да бъде само в main функцията. 

#include <iostream>
#include <climits>
#include <array>
using namespace std;


void longestSequence(int arr[],int n){
    int num1=0;
    int num2=0;
    int counter=1;
    int minCounter=INT_MIN;
    int number=0;
    for(int m=1;m<n;m++){
        num1=arr[m-1];
        num2=arr[m];
        if(num1==num2){
            counter++;

        }else{
            counter=1;
        }
        if(minCounter<=counter){
            number=num1;
            minCounter=counter;
        }
    }
    if(minCounter<=1){
        cout<<num2<<endl;
    }else if(minCounter>1){
        for(int k=0;k<minCounter;k++){
            cout<<number<<" ";
        }
    }


}
int main(){
    int length;
    cin>>length;
    int n=length;
    int arr[n];
    for(int i=0;i<n;i++){
        cin>>arr[i];
    }
    longestSequence(arr,n);
    return 0;
}

Тагове:
0
C++ Fundamentals
l000p avatar l000p 13 Точки

Здравей, давам ти моето решение, не е най-доброто, напротив. Давам ти го с друга цел, ако го разбереш ще разбереш и как да го направиш по-изискано. 
Да знам има много новобрански грешки, не ползвам референции, но хей работи на GCC компайлър :D (don't judge me please). 
Целта ми в това решение беше да използвам само C arrays  (макар и не много умело и извън стандарта на C++).

https://pastebin.com/0kBadSB4

0
Borislav919 avatar Borislav919 1 Точки

Благодаря.

0
galin_kostadinov avatar galin_kostadinov 166 Точки
Привет!

Масива може да ти е с дължина единица, вкючи и тази провека:
if (n == 1) {
    number = arr[0];
    num2 = arr[0];
}

Поздрави!

0
dmartinov avatar dmartinov 37 Точки

Добре, аз имам доста подобна логика на колегата от първия пост с тази разлика, че в main-а съм вкарал логика за случаи, в които ми се опитат да ми подадат 0 или отрицателно число. Имам и споменатата от теб проверка за масив с дължина единица. Въпреки всичко това нещо в Judge дава 80/100. Гледах го толкова много, че зациклих жестоко, но за съжаление не виждам какво изпускам. Може би някой граничен случай или нещо в логиката което ми бяга. Та...имам нужда от помощ. Благодаря предварително!

 

#include <iostream>
#include <array>

void longestSequence(int array[], int length) {

    int number1 = 0;
    int number2 = 0;
    int counter = 1;
    int minCounter = INT_MIN;
    int number = 0;

    for (int i = 1; i < length; i++){
        number1 = array[i - 1];
        number2 = array [i];

        if (number1 == number2){
            counter++;
        } else {
            counter = 1;
        }

        if (minCounter <= counter) {
            number = number1;
            minCounter = counter;
        }

        if (length == 1) {
            number = array[0];
            number2 = array[0];
        }
    }

    if (minCounter <= 1) {
        std::cout << number2 << std::endl;
    } else if (minCounter > 1) {
        for (int i = 0; i < minCounter; i++) {
            std::cout << number << " ";
        }
    }
}

int main() {

    int length = 0;
    std::cin >> length;

    if (length == 0) {
        std::cout << "0";
        return 0;
    }

    if (length > 0) {
        int array[length] = {0};

        for (int i = 0; i < length; i++) {
            std::cin >> array[i];
        }
        longestSequence(array, length);
        } else {
            return 0;
    }

    return 0;
}
0
galin_kostadinov avatar galin_kostadinov 166 Точки

Привет! На твоето решение добавих спомената провекра и ми дава 100/100.

#include <iostream>
#include <array>

void longestSequence(int array[], int length) {

    int number1 = 0;
    int number2 = 0;
    int counter = 1;
    int minCounter = INT_MIN;
    int number = 0;
    if (length == 1) {
        number = array[0];
        number2 = array[0];
    }

    for (int i = 1; i < length; i++){
        number1 = array[i - 1];
        number2 = array [i];

        if (number1 == number2){
            counter++;
        } else {
            counter = 1;
        }

        if (minCounter <= counter) {
            number = number1;
            minCounter = counter;
        }

        if (length == 1) {
            number = array[0];
            number2 = array[0];
        }
    }

    if (minCounter <= 1) {
        std::cout << number2 << std::endl;
    } else if (minCounter > 1) {
        for (int i = 0; i < minCounter; i++) {
            std::cout << number << " ";
        }
    }
}

int main() {

    int length = 0;
    std::cin >> length;

    if (length == 0) {
        std::cout << "0";
        return 0;
    }

    if (length > 0) {
        int array[length] = {0};

        for (int i = 0; i < length; i++) {
            std::cin >> array[i];
        }
        longestSequence(array, length);
        } else {
            return 0;
    }

    return 0;
}

Поздрави!

1
dmartinov avatar dmartinov 37 Точки

Оле Боже....сега видях къде ми е грешката. Аз съм сложил проверката в тялото на FOR-а. Просто ми е била грешно подредена логиката ама така е като зацикли човек :) Благодаря ти много! 

0
Jordan_Jordanov avatar Jordan_Jordanov 16 Точки

Ето едно решение което дава 100/100. Аз имах същия проблем, докато не прочетох тук, че пропускам проверката дали size = 1.

#include <iostream>
#include <vector>

using namespace std;

void fillArray(vector<int>& arr, size_t size)
{
    int num = 0;
    for (size_t i = 0; i < size; ++i)
    {
        cin >> num;
        arr.push_back(num);
    }
}

void printLongestSequence(vector<int>& arr)
{
    size_t size = arr.size(), counter = 0, maxCounter = 0;
    int currentNum = 0;
    if (size == 1)
    {
        cout << arr[0];
        return;
    }
    for (size_t i = 1; i < size; ++i)
    {
        if (i + counter - 1 < size)
        {
            i += counter - 1;
        }
        counter = 0;
        for (size_t j = i; arr[j] == arr[i]; ++j)
        {
            counter++;
            if (j == size - 1)
            {
                break;
            }
        }
        if (counter >= maxCounter)
        {
            maxCounter = counter;
            currentNum = arr[i];
        }
    }
    for (size_t i = 0; i < maxCounter; ++i)
    {
        cout << currentNum << " ";
    }
}

int main()
{
    vector<int> arr;
    int size;
    cin >> size;
    fillArray(arr, size);
    printLongestSequence(arr);
    
    return 0;
}

1
Vik1099 avatar Vik1099 1 Точки

Ето го моето решение ако на някой му е интересно.

https://pastebin.com/kwjBj1tY

0