Loading...
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
Programming Basics 18/08/2014 14:46:18
Anonymous:
Нарушава т.12 от Правилата на форума: "12. Във всеки пост е позволено цитирането на не повече от 15 реда код. Ако искате да споделите по-дълъг код, използвайте сайтове като Pastebin и Github)."
Filkolev avatar Filkolev 4482 Точки

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

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