Wyznacza i wypisuje różnicę pomiędzy długością najdłuższego znajdującego się w niej ciągu arytmetycznego o dodatniej różnicy, a długością najdłuższego ciągu arytmetycznego o ujemnej różnicy

0

Proszę napisać program, który wypełnia tablicę t[N] pseudolosowymi liczbami nieparzystymi z zakresu [1..99],
a następnie Wyznacza i wypisuje różnicę pomiędzy długością najdłuższego znajdującego się w niej ciągu
arytmetycznego o dodatniej różnicy, a długością najdłuższego ciągu arytmetycznego o ujemnej różnicy, przy
założeniu, że kolejnymi wyrazami ciągu są elementy tablicy o kolejnych indeksach.

Czy da się to zrobić w 2 pętlach?
Zrobiłem to tak, ale w 3 pętlach
https://pastebin.com/PwiZAANM

1

Moim zdaniem dało by się zejść do 2 pętli, tworząc 4 zmienne: Dla dodatnich i ujemnych, aktualnych oraz maksymalnych. Jeśli masz większą a zmienna dla "plusowych" jest zerowa, to znaczy że właśnie ją zaczynasz, i trzeba sprawdzić czy nie skończyłeś przy okazji minusowej. A w teorii to nawet do jednej, można po losowaniu od razu porównywać z poprzednią. Wtedy tablica była by zbędna, a w zadaniu wyraźnie jej wymagają.

1

Nie widzę powodów, żeby tego nie napisać w jednej pętli. Ustawić maksima początkowe na 2, i, zaczynając od drugiego elementu, sprawdzać czy tworzy ciąg z sąsiednimi, ewentualnie zapisywać różnice, inkrementować maksima i przesuwać się dalej.

0

Do jednej?
Nie potrafie sobie tego wyobrazić, mógłbyś zarzucić jakimś magicznym kodem? To ma być ciąg arytmetyczny o stałej różnicy.

W sumie ja zrobiłem dla ciągów niespójnych też, a tu musi być spójny, więc zadanko do ponownego rozkminienia :c

1

Początkowo, jak przeczytałem wątek, myślałem że chodzi o to żeby w ogóle nie użyć trzech forów, nie koniecznie zagnieżdżonych xD

bool pred(int diff, bool increasing)
{
    if (diff > 0 && increasing) return true;
    if (diff < 0 && !increasing) return true;
    return false;
}

int longest_arith(int T[], int len, bool increasing)
{
    if (len < 2) {
        // the sequence [x] is both increasing and decreasing
        return 0;
    }

    int diff = T[1] - T[0];
    int maxlen = -1;
    int curlen = 0;
    for (int i = 1; i < len; ++i) {
        if (pred(diff, increasing) && diff == T[i] - T[i-1]) {
            curlen += 1;
            if (curlen > maxlen) maxlen = curlen;
        }
        diff = T[i] - T[i-1];
    }
    return maxlen;
}

int f(int T[], int len)
{
    return longest_arith(T, n, true) - longest_arith(T, n, false);
}
1
int[] tab = new [] { 1, 2, 3, 6, 4, 2 };
int lastDifference = int.MaxValue; 
int longestIncreasing = 1;
int longestDecreasing = 1;
int currentSequenceLength = 1;

for (int i = 1; i < tab.Length; ++i)
{
    int curentDifference = tab[i] - tab[i - 1];

    if (curentDifference == lastDifference)
    {                
        currentSequenceLength++;
    }
    else
    {
        currentSequenceLength = 2;
        lastDifference = curentDifference;
    }

    if (lastDifference > 0)
    {
        longestIncreasing = Math.Max(longestIncreasing, currentSequenceLength);
    }
    if (lastDifference < 0)
    {
        longestDecreasing = Math.Max(longestDecreasing, currentSequenceLength);
    } 
}

int result = longestIncreasing - longestDecreasing;
0

Dziękuję serdecznie, źle zrozumiałem zadanie na początku. Myślałem, że podciąg może być niespójny.
Dzięki!

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