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

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
Axiomatik avatar Axiomatik 1581 Точки

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 7 Точки

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 1581 Точки

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 1060 Точки

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 1581 Точки

Super

0
icowwww avatar icowwww 1676 Точки

Здравей,

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

 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