Loading...
+ Нов въпрос
Dianov avatar Dianov 13 Точки

C# Advanced (1. Basic Stack Operations)

Здравейте, колеги! Някой има ли представа защо един от тестовете не минава и дава 80/100 точки? От 1 час мъча всякакви входове и output-a e верен, но Judge ми се заяжда за един от тестовете. Благодаря предварително на всички отзовали се за отделеното време!

Pastebin -> https://pastebin.com/cmXVJhW6

 

0
C# Advanced 21/11/2021 17:56:26
Dianov:
Problem solved.
icowwww avatar icowwww 2224 Точки
Best Answer

Здравей,

Когато търсиш дали елемента го има или проверяваш дали е с най-малко стойност:

 if (stackOfNumbers.Peek() <= smallestNumberInStack)
                        {
                            smallestNumberInStack = stackOfNumbers.Peek();
                            stackOfNumbers.Pop();
                            i--;
                        }

Само в случай, че елемент равен или по-малък от smallestNumberInStack махаш елемента и намаляваш итератора.

Обаче ако елемента не е такъв не го махаш. Съответно при следваща итерация проверките ти с Peek са невалидни, защото първия елемент си е все същия.

Затова винаги премахвай елемента.

https://pastebin.com/jhhxA43m

 

От друга страна има методи да намериш дали елемента съществува и да намериш най-малкия елемент:

stackOfNumbers.Contains(commands[2]);

stackOfNumbers.Min();

0
24/11/2021 19:58:36
Dianov avatar Dianov 13 Точки

Благодаря!

0
Axiomatik avatar Axiomatik 2235 Точки

Sorry can't find that one mistake, must be in that for-loop when popping numbers in order to find the smallest number, :-(

using System;
using System.Collections.Generic;
using System.Linq;

namespace BasicStackOperations
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] commands = Console.ReadLine()
                .Split(" ", StringSplitOptions.RemoveEmptyEntries)
                .Select(int.Parse)
                .ToArray();

            int[] numbers = Console.ReadLine()
                .Split(" ", StringSplitOptions.RemoveEmptyEntries)
                .Select(int.Parse)
                .ToArray();

            Stack<int> stackOfNumbers = new Stack<int>();

            for (int i = 0; i < commands[0]; i++)
            {
                stackOfNumbers.Push(numbers[i]);
            }

            for (int i = 0; i < commands[1]; i++)
            {
                if (stackOfNumbers.Count > 0)
                {
                    stackOfNumbers.Pop();
                }
            }

            //If stack is not empty:
            if (stackOfNumbers.Count != 0)
            {
                int smallestNumberInStack = int.MaxValue;
                bool printSmallestNumber = true;

                //for (int i = 0; i < stackOfNumbers.Count; i++)
                //{
                //    // If number is presented in the stack -> print "true".
                //    if (commands[2] == stackOfNumbers.Peek())
                //    {
                //        Console.WriteLine("true");
                //        printSmallestNumber = false;
                //        break;
                //    }
                //    // If number is not presented in the stack -> remember smallest number.
                //    //else
                //    //{
                //    //    if (stackOfNumbers.Peek() <= smallestNumberInStack)
                //    //    {
                //    //        smallestNumberInStack = stackOfNumbers.Peek();
                //    //        stackOfNumbers.Pop();
                //    //        i--;
                //    //    }
                //    //}
                //}

                if (stackOfNumbers.Any(n => n == commands[2]))
                {
                    Console.WriteLine("true");
                    printSmallestNumber = false;
                }

                // Print smallest number.
                if (printSmallestNumber == true)
                {
                    smallestNumberInStack = stackOfNumbers.Min();
                    Console.WriteLine(smallestNumberInStack);
                }
            }
            // If stack is empty -> print 0
            else
            {
                Console.WriteLine(0);
            }
        }
    }
}

 

0
Dianov avatar Dianov 13 Точки

I've tried every single input and output is always the expected one. Don't know why Judge doesn't accept one of the solutions. Can you find a gap in the logic of this for loop though? Next task with queues is giving 100/100 with the exact same logic. :D

1
23/11/2021 14:17:02
Axiomatik avatar Axiomatik 2235 Точки

Looked at it a couple of times, must be something easy to overlook. Try to rewritte the for-loop or use a slightly different implementation to find that last error. My best guess is that some edge case fails when reassigning the smallest number in the else{} validation.

Best,

0
svephoto avatar svephoto 1183 Точки

Hi, Dianov and Axiomatik,

 

If you don't mind, I can offer to some extent different version of the solution according to another one that I have in Java: https://pastebin.com/iUXmp3n0. I hope it would be useful. And yes - Judge gives 100/100. laugh

1
23/11/2021 23:09:49
Axiomatik avatar Axiomatik 2235 Точки

Super

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.