Някой може ли да обясни един алгоритъм?

ReminD

Well-Known Member
Може ли малко помощ за една домашна. Може ли някой да обясни къде бъркам, аз досега намерих няколко грешки, но хич не ми идва наум как да ги навържа в задачата, пък е доста елементарна, отделни проблеми от същата задача съм ги решавал и judge ми дава 100/ 100, но тук бая се омотах, ако може някой да разясни подробно как да стане и като цяло колко и къде съм се омазал в логиката на задачата.
28b0a47bf15e7a6c5d639d0f4d56d560.png


Идеята е да не се ползват arrays/ lists/ дикшинарита и всякакви други тип данни, понеже с arrays ми се получава, а така омазвам логиката някъде ;/
http://pastebin.com/bi55pVc1 - това ми е кода, знам че quality-то е никакво, но нека първо да заработи, пък после ще си я оптимизирам.
В стъпки ще опиша какво съм направил

1> декларираме променливите, които ще трябват за задачата
2> четем броя на числата, които ще четем
3> четем първото число, проверяваме дали е четно / нечетно
4 > приемаме, че е максимум и минимум и го добавяме към Sum
5> въртим цъкълче от nums - 1 ( понеже 1 число вече сме чели - стъпка 3 )
6> в цикъла проверяваме ако числото е четно нечетно:
ако е четно - прибавяме го към EvenSum и сравняваме дали е по-голямо от max и по-малко от мин и ако е го слагаме като max/min /
7> същото за нечетните

Като стъпки би трябвало това да дава решение, понеже подобни задачи съм решавал, но с отделни проблеми ( суми само на четни и проверка разликата им с Math.Abs() , етц.


Къде бъркам в цялата работа, някои от входните данни, където гърми, аха направо гърми навсякъде, без evenSum, oddSum - сумите са точни, също и максималните числа even /odd - всичко друго гърми.
Да не говорим, че от примерните данни 1 го брои за четно, а пък на 0 аз гърмя при компилация.

Моля помагайте, че ако тръгна да оправям и последните изречения, които написах, ще се омажа още повече.
Също какво ще рече броим от 1? И също открих, че очакван изход за - 2.5 e even, трябва ли да интосвам по време на цялата работа ;/ направо се омазах

https://judge.softuni.bg/Contests/154/Simple-Loops - проблем 11 - може да се изпрати решение на доста езици, не само C#.
Пуснете обяснения ако ударите 100/ от 100 ще съм много благодарен.


Тенкс
 
Последно редактирано:
Е не, почнах да си оправям нещата и още повече се омазах. Ще чакам някой да обясни стъпките, че да отиде на 100/100 точки.
 
Така е като не се чете условието, трябвало да се проверяват позициите в цикъла, а не самите числа, сега ще го закодя и ще видя дали ще стане.
Credits към @tripledeuce
 
Е пич, мерси и аз мога да ползвам google, не искам да гледам чужди решения, искам сам да си ги кодя ; }. Чуждите решения ги гледам чак като схвана логиката и скалъпя 100/100 и мисля как да се направи по-читаво кода.
 
Оправихте ли се със задачата, Аз от условието не мога да разбера само дали се чете от всички банки, и поред ли трябва да става четенето? :)
Извинявай, мислех, че това са ти входни данни за програмата, а то май са примери ;-).
 
Последно редактирано:
На нищо не ви учи Наков, + на картинката данните са грешни, изхода не е верен.
PHP:
<?
$input = [0];
$result = [
    'OddSum' => 0,
    'OddMin' => 0,
    'OddMax' => 0,
    'EvenSum' => 0,
    'EvenMin' => 0,
    'EvenMax' => 0,
];

foreach($input as $k => $v){
    if(is_numeric($v)){
        if($v%2){
            echo 'Odd: ' . $v . '<br/>';
            if($v > $result['OddMax']){
                $result['OddMax'] = $v;
            }

            if($result['OddMin'] == 0){
                $result['OddMin'] = $v;
            } else {
                if ($v < $result['OddMin']) {
                    $result['OddMin'] = $v;
                }
            }

            $result['OddSum'] += $v;
        } else {
            echo 'Even: ' . $v . '<br/>';

            if($v > $result['EvenMax']){
                $result['EvenMax'] = $v;
            }

            if($result['EvenMin'] == 0){
                $result['EvenMin'] = $v;
            } else {
                if ($v < $result['EvenMin']) {
                    $result['EvenMin'] = $v;
                }
            }

            $result['EvenSum'] += $v;
        }
    }
}

if($result['OddMax'] == $result['OddMin']){
    $result['OddMax'] = $result['OddMin'] = 'No';
}

if($result['EvenMax'] == $result['EvenMin']){
    $result['EvenMax'] = $result['EvenMin'] = 'No';
}

echo '<pre>';
print_r($result);
echo '</pre>';
 
Със индекса на масива пак не излизат примерите, грешни са.

PHP:
<?
$input = [1 => 6,2,3,5,4,2,1];
$result = [
    'OddSum' => 0,
    'OddMin' => 0,
    'OddMax' => 0,
    'EvenSum' => 0,
    'EvenMin' => 0,
    'EvenMax' => 0,
];

foreach($input as $k => $v){
    if(is_numeric($v)){
        if($k%2){
            echo 'Odd: ' . $v . '<br/>';
            if($v > $result['OddMax']){
                $result['OddMax'] = $v;
            }

            if($result['OddMin'] == 0){
                $result['OddMin'] = $v;
            } else {
                if ($v < $result['OddMin']) {
                    $result['OddMin'] = $v;
                }
            }

            $result['OddSum'] += $v;
        } else {
            echo 'Even: ' . $v . '<br/>';

            if($v > $result['EvenMax']){
                $result['EvenMax'] = $v;
            }

            if($result['EvenMin'] == 0){
                $result['EvenMin'] = $v;
            } else {
                if ($v < $result['EvenMin']) {
                    $result['EvenMin'] = $v;
                }
            }

            $result['EvenSum'] += $v;
        }
    }
}

if($result['OddMax'] == $result['OddMin']){
    $result['OddMax'] = $result['OddMin'] = 'No';
}

if($result['EvenMax'] == $result['EvenMin']){
    $result['EvenMax'] = $result['EvenMin'] = 'No';
}

echo '<pre>';
print_r($result);
echo '</pre>';
 
На нищо не ви учи Наков, + на картинката данните са грешни, изхода не е верен.
PHP:
<?
$input = [0];
$result = [
    'OddSum' => 0,
    'OddMin' => 0,
    'OddMax' => 0,
    'EvenSum' => 0,
    'EvenMin' => 0,
    'EvenMax' => 0,
];
Всъщност допускате логическа грешка. При вече инициализализирана променилива не е нужно да я инициализирате отново с оператор за равенство. Което ще рефлектира и на отговора, поради двйната операция за 1-вия вход за четно и нечетно. Тоест $x = $v последвано от $x += $v в едина и съща итерация на цикъла.
 
Е дано с тая тема да накараме админите да пуснат някакви категории за програмиране поне...
 
Всъщност допускате логическа грешка. При вече инициализализирана променилива не е нужно да я инициализирате отново с оператор за равенство. Което ще рефлектира и на отговора, поради двйната операция за 1-вия вход за четно и нечетно. Тоест $x = $v последвано от $x += $v в едина и съща итерация на цикъла.
ти добре ли си? сметни си го наум. сбора на четните позиции на първия пример е 9 не е 8, макса е 5 мина е 2 даже се в черно по лесно да ги сметнеш.
 
Да извинявай, недоглеждане от моя страна в имената на елементите. Аз бих използвал null вместо 0 и ===.
ПП дегустирам една бутилка вино от Старосел ако може това да ме извини.
 
Обяснение на задачата за всички които са се зачудили:
Въвеждате n - броя на всички числа.

Въртите цикъл от 1 до n

Гледате дали числото има четен или нечетен индекс
След това проверявате дали е по-малко от минимума до момента и дали е по-голяма от максимума за текущия вид числа
Добвяте към сумата.
Не ползвате масив а само една променлива.

Ето и с++ код за цикъла. На повечето езици ще се компилира. Само трябва да си смените командата за вход

Инициализирате си минимума и максимума според ограниченията
for (i=1;i<=n;i++)
{
cin>>a;
if(i%2==0)
{
evenMax = max(a, evenMax);
evenMin = min(a,evenMin);
evеnSum += а;
}
else
{
oddMax = max(a, oddMax);
oddMin = min(a,oddMin);
oddSum += а;
}
}
 
Последно редактирано:
а каква ти е първоначаната стойност на evenMin и evenMax? + нямаш проверка дали е число входа, такъв мазалоч може да стане с този код. А това какво трябва да е? evenMax ==max(a, evenMax); две проверки без присвояване? така да не е: evenMax = max(a, evenMax);
 
а каква ти е първоначаната стойност на evenMin и evenMax? + нямаш проверка дали е число входа, такъв мазалоч може да стане с този код. А това какво трябва да е? evenMax ==max(a, evenMax); две проверки без присвояване? така да не е: evenMax = max(a, evenMax);

Опс - не е проверка. Присвояване е. Ще се коригирам. И в контекста на джъджа на софтуни входа е коректен. За това няма нужда де се проверява валидността. Още повече, че там пишат на шарп и проверката дали е число там е тривиална.

За началните стойности написах - че зависят от ограниченията за вход които трябва да са зададени в условието. Просто в скрииншота липсват. Мин-а ще ти е най-голямата от тази стойност. Макса съответно - най-малката. А сумата на 0. И естествено като типизиран език - пишеш преди цикъла int a; За бързодействие и алгоритмични задачи особено на С++ е по-добра идея. Естествено на prod важат малко по-други принципи.
 
Опс - не е проверка. Присвояване е. Ще се коригирам. И в контекста на джъджа на софтуни входа е коректен. За това няма нужда де се проверява валидността. Още повече, че там пишат на шарп и проверката дали е число там е тривиална.

За началните стойности написах - че зависят от ограниченията за вход които трябва да са зададени в условието. Просто в скрииншота липсват. Мин-а ще ти е най-голямата от тази стойност. Макса съответно - най-малката. А сумата на 0. И естествено като типизиран език - пишеш преди цикъла int a; За бързодействие и алгоритмични задачи особено на С++ е по-добра идея. Естествено на prod важат малко по-други принципи.

Колега, нарочно те питах каква ти е първоначалната стойност на evenMin, защото на първата врътка трябва да сравниш a с нещо, така както си го написал не е ясно с какво сравняваш. А за проверката до колкотто виждам от входа има тирета или е празно ли не знам.
 
Колега, нарочно те питах каква ти е първоначалната стойност на evenMin, защото на първата врътка трябва да сравниш a с нещо, така както си го написал не е ясно с какво сравняваш. А за проверката до колкотто виждам от входа има тирета или е празно ли не знам.
Ако погледнеш внимателно ще установиш, че тиретата са минуси, а не празни пространства или тирета и т.н Това е алгоритмична задача, а не игра на ифове за вход и изход.

За инишъл стойността на evenMin ще се потретя. ВСЯКА една задача от този тип ако е коректно Ззададена ТРЯБВА ДА ИМА ОГРАНИЧЕНИЯ НА ВХОД. Това че на снимката на автора на темата липсва не значи че ги няма. Това е интервал в който е входа и данните са съобразени с него. Ако си зададеш макса - число по-малко от това със сигурност при първата проверка ще запишеш първото число. От там вече проверката си върви. Съответно минимума ще го зададеш число по-голямо от най-голямото възможно за вход. Отново при първата проверка първото ще спечели и всички по-нататъшни проверки ще са ти ок. Не знам как по-просто да го обядсня. Ако не искаш да повярваш че входа е ограничен - макса можеш да си го зададеш като минимума за типа (да речем int), а мин-а като най-голямата стойност.
 

Горе