[Exam Problems] C# Basics - Exam 14 April 2014 Morning - {02}Biggest Triple - проблем
Здравейте на всички!
Бих искала да ви помоля за помощ на тази задача... Проблемът е, че получавам 87/100 точки и не мога да си открия грешката. Видях даденото авторско решение и мисля, че има грешка
(става въпрос за края на кода, където се извежда резултата на конзолата, а именно:
while (maxSum != 0)
{
Console.Write(numbers[start]);
maxSum = maxSum - int.Parse(numbers[start]);
start++;
if (maxSum != 0)
{
Console.Write(" ");
}
}
),
тъй като ако имаме дадения Input - "1 2 3 10 0 0 2 1 0" (без интервалите), не трябва ли тогава на конзолата да се изведе: "10 0 0", вместо "10" (на конзолата се извежда "10" при дадения авторски код)? При моето решение този проблем не се получава..и въпреки това нямам пълния брой точки.
Моят код: (едва ли е прекрасно решение, но това се сетих)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string sequence = Console.ReadLine();
string[] sequenceParts = sequence.Split(' ');
List<int> numbers = new List<int>();
int max = int.MinValue;
List<int> maxNums = new List<int>();
for (int i = 0; i < sequenceParts.Length; i++)
{
numbers.Add(Convert.ToInt32(sequenceParts[i]));
}
for (int k = 1; k <= numbers.Count; k++)
{
if (k == 3)
{
max = numbers[k - 1] + numbers[k - 2] + numbers[k - 3];
maxNums.Add(numbers[k - 3]);
maxNums.Add(numbers[k - 2]);
maxNums.Add(numbers[k - 1]);
}
else
{
if (k % 3 == 0)
{
int max1 = numbers[k - 1] + numbers[k - 2] + numbers[k - 3];
if (max1 > max)
{
max1 = max;
maxNums.Clear();
maxNums.Add(numbers[k - 3]);
maxNums.Add(numbers[k - 2]);
maxNums.Add(numbers[k - 1]);
}
}
if (k == (numbers.Count) && k % 3 != 0)
{
if (k % 3 == 2)
{
int max1 = numbers[k - 1] + numbers[k - 2];
if (max1 > max)
{
max1 = max;
maxNums.Clear();
maxNums.Add(numbers[k - 2]);
maxNums.Add(numbers[k - 1]);
}
}
else
{
int max1 = numbers[k - 1];
if (max1 > max)
{
max1 = max;
maxNums.Clear();
maxNums.Add(numbers[k - 1]);
}
}
}
}
}
if (numbers.Count == 3)
{
for (int z = 0; z < 3; z++)
{
//if (z == 2)
//{
// Console.Write(numbers[z]);
//}
//else
//{
Console.Write(numbers[z] + " ");
//}
}
}
else
{
for (int i = 0; i < maxNums.Count; i++)
{
//if (i == maxNums.Count - 1)
//{
// Console.Write(maxNums[i]);
//}
//else
//{
Console.Write(maxNums[i] + " ");
//}
}
}
Console.ReadLine();
}
}
}
Тяхното решение можете да изтеглите оттук: http://judge.softuni.bg/Contests/8/CSharp-Basics-Exam-14-April-2014-Morning
Открих грешката:
На няколко пъти при проверка дали текущата сума max1 > max, в тялото на условната конструкция, където пълниш наново списъка с текущите числа, казваш max1 = max, а трябва да е обратното - max = max1. Твоята логика е в max да запазваш най-голямата сума, ако max1 > max и като зададеш max1 = max реално на всяка стъпка продължаваш да проверяваш текущата сума с първоначалната (сумата на първите три числа). Така твоят алгоритъм изписва последната комбинация от числа, които имат сума по-голяма от първоначалната, а не числата с най-голяма сума.
С промените кодът ти дава 100 точки. На три места трябва да се направи корекцията - редове 40, 56 и 67.
В страницата на съответния курс има аврхиви, които съдържат освен условията и авторските решения на изпитните задачи, така и самите тестове, които прави Judge. В случая това е изпит от C# Basics May, така че ТУК, най-долу може да намериш архивите.
Тази задача е от вариант 7, може да изтеглиш направо от този линк материалите.