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

Недей да копираш такова количество код директно във форума, както виждаш трудно се чете така. Ползвай Pastebin или Github за целта.

Ето моето решение, което дава 100 точки: ЦЪК. Не съм го мислил след като изкарах точките, така че и то едва ли е много добро.

Работи обаче и с посочения от теб вход, така че не би следвало там да е проблемът при теб, някъде другаде явно ти отнема точки. Провери ли с тестовете от Judge къде точно се разминава твоят отговор с този от авторското решение?

Иначе си права за грешката в авторското решение, алгоритъмът за вадене на резултата е очевидно грешен, когато има нули накрая на намерената най-голяма тройка или двойка.

Ще разгледам твоето решение и ще пиша пак като открия нещо. Грешка вероятно им някъде, но не е очевидна. 

 

0
asyamincheva avatar asyamincheva 20 Точки
Тестовете от Judge не можах да намеря в Интернет...сега ще прегледам решението ти, благодаря :)
0
Filkolev avatar Filkolev 4482 Точки

Открих грешката:

На няколко пъти при проверка дали текущата сума max1 > max, в тялото на условната конструкция, където пълниш наново списъка с текущите числа, казваш max1 = max, а трябва да е обратното - max = max1. Твоята логика е в max да запазваш най-голямата сума, ако max1 > max и като зададеш max1 = max реално на всяка стъпка продължаваш да проверяваш текущата сума с първоначалната (сумата на първите три числа). Така твоят алгоритъм изписва последната комбинация от числа, които имат сума по-голяма от първоначалната, а не числата с най-голяма сума.

С промените кодът ти дава 100 точки. На три места трябва да се направи корекцията - редове 40, 56 и 67.

3
Filkolev avatar Filkolev 4482 Точки

В страницата на съответния курс има аврхиви, които съдържат освен условията и авторските решения на изпитните задачи, така и самите тестове, които прави Judge. В случая това е изпит от C# Basics May, така че ТУК, най-долу може да намериш архивите.

Тази задача е от вариант 7, може да изтеглиш направо от този линк материалите.

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