[Exam Problems] C# Basics - Exam 14 April 2014 Morning - {02}Biggest Triple - проблем

[Exam Problems] C# Basics - Exam 14 April 2014 Morning - {02}Biggest Triple - проблем

asyamincheva avatar asyamincheva 20 Точки

[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

1
Основи на програмирането 18/08/2014 14:46:18
Anonymous:
Нарушава т.12 от Правилата на форума: "12. Във всеки пост е позволено цитирането на не повече от 15 реда код. Ако искате да споделите по-дълъг код, използвайте сайтове като Pastebin и Github)."
Filkolev avatar Filkolev 4425 Точки

Моите препоръки по кода:

1) В началото взимаш входа и го сплитваш. След това конвертираш към числа и тях ги слагаш в списък с цикъл. Може да стане малко по-кратко като директно конвертираш елементите на масива с Array.ConvertAll. 

Числата, т.е. numbers, което при теб е списък, ще е масив (разлика няма, броят числа е фиксиран от входа).

Може например да кажеш така: int[] numbers = Array.ConvertAll(sequenceParts, x => int.Parse(x));

На метода ConvertAll му подаваш две неща - масива, който съдържа стринговете, и израз, който указва какво точно да се направи с всеки елемент, в случая да се парсне към int. Това е lambda expression - x => int.Parse(x) -  и е доста удобно за ползване.

 

2) Понеже ползваш списък, за да запазваш числата с най-голяма сума, накрая при принтирането няма нужда да проверяваш колко точно са те на брой. Свойството Count на списъка пази броят елементи, които си вкарала вътре и програмата работи по абсолютно същия начин ако накрая изпечатиш числата така:

for (int i = 0; i < maxNums.Count; i++)
{
    Console.Write(maxNums[i] + " ");
}

 

0
asyamincheva avatar asyamincheva 20 Точки

Благодаря за съветите, досега не бях ползвала Array.ConvertAll :)

0