Loading...
jerrynp avatar jerrynp 4 Точки

Arrays - Exercise - 09. Kamino Factory - 90/100 в Judge

Здравейте, колеги!
Забих на една задача, която решавам вече доста часове.
Става въпрос за задачата 09. Kamino Factory(use the force!) от Arrays - Exercise.

Условие:
https://softuni.bg/trainings/resources/officedocument/67743/arrays-exercise-programming-fundamentals-with-csharp-january-2022/3606

В Judge получавам резултат 90/100, многократно преглеждам кода и не мога да въдя къде би било възможно да гръмне.
Това ми е кодът - https://pastebin.com/KQfGif0R

Всякаква градивна критика е добре дошла! :) 

Тагове:
0
C# Fundamentals
Axiomatik avatar Axiomatik 2422 Точки

If validations can be compacted and simplified, especially the last if-validation outside of the for-loop. Keep also in mind that inside of your for-loop the current value as well as the next one need to be checked if equal to 1.

Standard solution code:

using System;
using System.Linq;

namespace kaminoFactory
{
	class Program
	{
		static void Main(string[] args)
		{
			int n = int.Parse(Console.ReadLine());
			string command = Console.ReadLine();
			int maxOnes = int.MinValue;
			int maxSequence = int.MinValue;
			int sequenceCounter = 0;
			int minStarter = int.MaxValue;
			int bestSequence = 0;
			string strongestSequence = string.Empty;

			while (command != "Clone them!")
			{
				sequenceCounter++;
				int[] sequence = command.Split('!', StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray();
				int counterOnes = 0;
				int counterSequence = 0;
				int sequenceStarter = 0;

				for (int i = 0; i < n - 1; i++)
				{
					if (sequence[i] == 1 && sequence[i + 1] == 1)
					{
						if (counterSequence == 0)
						{
							sequenceStarter = i;
						}
						counterSequence++;
					}
				}

                foreach (int one in sequence)
                {
                    if (one == 1)
                    {
                        counterOnes++;
                    }
                }
				
				if (counterSequence > maxSequence || (sequenceStarter < minStarter && counterSequence >= maxSequence) || (sequenceStarter == minStarter && counterSequence >= maxSequence && counterOnes > maxOnes))
				{
					maxOnes = counterOnes;
					maxSequence = counterSequence;
					minStarter = sequenceStarter;
					bestSequence = sequenceCounter;
					strongestSequence = string.Join(" ", sequence);
				}
				
				command = Console.ReadLine();
			}

			Console.WriteLine($"Best DNA sample {bestSequence} with sum: {maxOnes}.");
			Console.WriteLine($"{strongestSequence}");
		}
	}
}

 

0
ezope avatar ezope 1 Точки

Кратка вметка към горното решение на Axiomatik, добре би било да се нулира броячът counterSequence между отделните инпути, защото иначе не покрива случаи като този:
 

9

1!1!0!1!1!0!1!1!0

1!1!1!0!0!0!0!0!0

Предлагам и сходно авторско решение:

int sampleLength = int.Parse(Console.ReadLine());
string input = "";
int sampleCounter = 0;
int[] bestSampleArray = new int[sampleLength];
int bestSequenceSum = 0;
int bestSampleNumber = 0;
int bestStartingIndex = 0;
int bestSequence = int.MinValue;
while ((input = Console.ReadLine()) != "Clone them!")
{
    sampleCounter++;
    int[] sequenceArray = input.Split('!', StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray();
    int sequenceCounter = 0;
    int currentBestSequenceCounter = 0;
    int sequenceStart = 0;
    int currentBestStartingIndex = 0;
    int currentSum = 0;
    for (int i = 0; i < sequenceArray.Length; i++)
    {
        if (sequenceArray[i] == 1)
        {
            if (sequenceCounter == 0)
            {
                sequenceStart = i;
            }
            currentSum++;
            sequenceCounter++;
        }
        if (sequenceArray[i] == 0 || i == sequenceArray.Length - 1)
        {
            if (currentBestSequenceCounter < sequenceCounter)
            {
                currentBestStartingIndex = sequenceStart;
                currentBestSequenceCounter = sequenceCounter;
            }
            sequenceCounter = 0;
        }
    }
    if (currentBestSequenceCounter > bestSequence
        || (currentBestSequenceCounter == bestSequence && currentBestStartingIndex < bestStartingIndex)
        || (currentBestSequenceCounter == bestSequence && currentBestStartingIndex == bestStartingIndex && currentSum > bestSequenceSum)
       )
    {
        bestSequence = currentBestSequenceCounter;
        bestSampleNumber = sampleCounter;
        bestSequenceSum = currentSum;
        bestStartingIndex = currentBestStartingIndex; ;
        bestSampleArray = sequenceArray;
    }
}
Console.WriteLine($"Best DNA sample {bestSampleNumber} with sum: {bestSequenceSum}.");
Console.WriteLine(string.Join(" ", bestSampleArray));

 

1
krum_43 avatar krum_43 756 Точки

Ето още едно работещо решение:

https://pastebin.com/R6rNxGZe

 

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