Професионална програма
Loading...
+ Нов въпрос
i.minchev.qa avatar i.minchev.qa 34 Точки

11. Equal Sums - Chapter: Arrays - Exercises - ??

Здравейте,

може ли малко помощ?

Код верен на 71% -  http://pastebin.com/dGtDsD49 , някъде обаче се дъни и ми трябва Вашата помщ за останалите 29%.

Благодаря Ви предварително за включванията.

 

Поздрави.

Тагове:
1
Programming Basics 30/05/2016 15:57:33
AntyfrizZz avatar AntyfrizZz 238 Точки
Best Answer

Здравей,

 

Изгубих бая време да намеря условието на задачата. Следващия път като ти трябва помощ дай повече информация за условието. Така повече хора биха ти помогнали.

Погледнах ти решението, но не мисля че си подходил по най - удачния начин. Въртиш ненужни цикли. Мога да ти предложа що годе прилично решение.

Правиш си масив int[2, numbers.Lenght]. 1вия ред на този масив ще съдържа сумата на елементите за текущия индекс от ляво на него. 2рия ред съответно ще съдържа сумата на елементите дясно от него. За начало [0, 0] = 0 (нямаш елементи в ляво на 0левия индекс. [0, 1] = input.Sum() - input[0]. След като сетнеш тези 2 стойности провери дали не са равни. Ако са равни, значи си намерил търсения индекс - принтираш и пишеш return; (тоя ретърн ще те изкара от метода в който си, и понеже си в Main, ще ти приключи програмата)

Ако не са равни, завърти едиц цикъл от 1 до numbers.Length - 1. На всяка итерация попълвай стойности в 1вия и съответно във втория ред (това ще те оставя сам да си го откриеш как да стане). След като попълниш стойностите за дадена итерация, преди да продължиш със следващата, провери дали стойностите са равни. Ако са равни - принтираш i и return;

Ако целия цикъл се извърти и не е намерено такова число, след него просто принтирай "no".

 

Edit: Подобрение на това решение е, да пазиш данните в масив [2, 2], като презаписваш стойностите. Реално няма нужда да се пазят данни за всички индекси.

 

Поздрави!

3
27/05/2016 16:55:15
i.minchev.qa avatar i.minchev.qa 34 Точки

Благодаря ти много за включването AntyfrizZz,

1. Прав си наистина пропуснах да посоча път към условието.

    Ето го и него - https://softuni.bg/trainings/1367/programming-fundamentals-may-2016

 Селция - Arrays - Exercises, фаил  Упражнение - Условия

2. Ето ново решение кето пак дава 71 точки само - http://pastebin.com/05gHHheP

Честно да кажа не схващам защо трябва да ползвам двумерен масив вмест просто 2 отделни суми sumLeft и  int sumRight.

 2.1 Стартирам от член на масива i = 1;

2.2 Обхождам масив int []number със for (int i = 1; i < number.Length - 1; i++) // пропускам умишлено 1-вия и последния елементи на масива. Защо: т.к в ляво от пъривя и в дясно от последния елемент няма нищо за събиране.

2.3 Сумирам всичко в ляво от текущия елемент  'i' и ако е изпълнено условието  if (sumLeft == number[i])   тогава сумирам всичко от дясно for (int iRight = i + 1; iRight < number.Length; iRight++)

2.4  if (sumLeft == sumRight)
                {
                    index = i;
                    break;
                }

Би трябвало да сработи, но не 71/100.

Започвам да си мисля, че е проблемът е в грешно изписване на "no" или някаква друга подобна щуротия.

След малко ще пробвам и по твоя метод колега. 

 

1
AntyfrizZz avatar AntyfrizZz 238 Точки

Здравей,

Така както си написал кода си, искаш сумата на елементите в ляво да е равна на сумата на елементите в дясно, както и те 2те да са равни на самия елемент. Никъде в условието не пише такова нещо. Искат само сумата в ляво от елемента да е равна на тази от дясно. Чети си добре условията. Чист късмет е, че имаш толкова точки :). Оправи си това условие и може да получиш 100/100.

 

В твоето решение, при всяко завъртане на главния цикъл, ти завърташ още 2 малки цикъла, което доста забавя нещата. В случая може и да ти даде 100 точки с такова решение на този етап от обучението си, но е добре за напред да ги съобразяваш тези работи.

Двумерният масив се изпозлзва точно за това, да не въртиш постоянно цикли и да пресмяташ нещо, което може да бъде пресметнато и без да въртиш едно и също нещо постоянно. Сега ще ти покажа стъпка по стъпка какво се случва като попълваш.

Примерът от условието 1 2 3 3

Преди да завъртиш цикъла, сетни стойностите в 1вата колона. Ако са равни, принтираш 0 и return;

 

Число 1 2 3 4
Сума в ляво от него  0  result[0, i - 1] + input[i - 1]     
Сума в дясно от него    numbers.Sum() - numbers[0]   result[1, i - 1] - input[i]    

 

След това завърташ само един цикъл. В твоето решение с главния цикъл въртиш и още 2 излишни в него. Реално, таблицата със суми в ляво се попълва, като към предходната стойност добавиш стойността на предходния индекс. Стойностите в реда "Сума в дясно" се получават, като от предходния индекс извадиш стойността на текущия индекс. Проверяваш дали 2те стойности за текущия индекс са равни. Ако са равни - принтираш индекса и return;

Ако след извъртане на цикъла не си намерил такава стойност, принтираш "no" и това е.

 

Ако си разбрал това решение, пробвай да го имплементираш с масив 2 на 2. Сетваш си началните стойности в 1вата колона, на следвашата итерация пишеш във втората колона, на следващата итерация презаписваш в 1вата колона, на следващата във 2рата и т.н.

 

Поздрави!

1
27/05/2016 17:27:01
chadel4e avatar chadel4e 15 Точки

Ето го моето решение и аз бях зациклил на 71 но го оправих. Цък

1
i.minchev.qa avatar i.minchev.qa 34 Точки

11. Equal Sums от глава - Arrays.

0
i.minchev.qa avatar i.minchev.qa 34 Точки

Изключително много Благодаря на всички включили се.

Другата седмица ще имам възможност да анализирам внимателно нещата и моите грешки по задачата.

Приятен уикенд. :)

0
tihomirj avatar tihomirj 33 Точки

Условието на самата задача не е съвсем прецизно. Въпреки че в условието не е казано, решението показва само един частен случай, когато има само един такъв индекс. Могат да се покажат много такива редици, в които индексите са повече от един. Пример:

1, 0, 0, 0, 0 ,1 или 1, 2, 3, -6, 0, 0 , 0, 1, или -1, 1, 0, 0, 0, 2, -2, ....- мисля, че е очевидно, че има няколко решения.

Според мен е много по-лесно, интуитивно, кратко  и очевидно, задачата да се реши с LINQ методите - skip и take и един списък, който да пази индексите. След това със string.Join  се изписват индексите. Ако решението е едно се показва само един индекс, ако са няколко се показват всички индекси.

http://pastebin.com/SJc9tBe6

Редакция: Всъщност сега си давам сметка, че Linq изучаваха само януарската и може би февруарската група?

 

 

2
30/05/2016 20:54:32
i.minchev.qa avatar i.minchev.qa 34 Точки

Здравейте,

1. AntyfrizZz ето го кодът работещ с 2-мерен резултатен масив [2, input.Length] и  1 for loop - http://pastebin.com/edit/2hbgA0NQ

   Без твоя помоще никога нямаше да се се сетя за толкова хитър от моя гледна точка похват.

   Решаване на задачата с резултатен масив с размер [2, 2] ще опитам малко по-нататък, че трябва да понаваксам малко с материала :).

2. Много благодаря и за включването на tihomirj с LINQ кода, много изчистено изглежда решението.

   Отново ми прави впечатление че LINQ кода с неговото (Time: 0.031 s) работи по-бавно от стандартен дълъг код(Time: 0.015 s).

   Предполагам, че това е в резултат на 2-кратно Parse-ване: 1-ви път LINQ кода, 2-ри път серията от команди криеща се зад всеки съкратен ред.

Изключително благодаря на всички за полезните включвания, покрай тази задача научих много нови неща и се надявам, че ще е полезна и за други обучаващи се. :)

Спорен ден на всички. :)))

    

0
elena.nikolova2 avatar elena.nikolova2 63 Точки

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

Ето линк към моето решение, което ми judje оцени с 80 точки:

http://pastebin.com/gfcWjfXY

Ако някой има време да хвърли бърз поглед, бих се радвала много на отзиви :)

0
05/06/2016 01:57:02
i.minchev.qa avatar i.minchev.qa 34 Точки

Здравей Елена,

ето ти работещо решение с for-цикли за лявата и дясната части - http://pastebin.com/i3Vhze8t

Огледай го, нюансите са наистина много тънки и малка разлика в задаването на начални и крайни стойности на броячите водят до съществени разлики в крайния резултат.

Поиграй си с дебъгера и си доработи решението, ще се радвам ако го постнеш после. :)

0
06/06/2016 07:34:38
elena.nikolova2 avatar elena.nikolova2 63 Точки

Здравей,

мерси за отговора :)

Поиграх си с дебъгера още вчера ии наистина разликата се оказа много малка. До сега използвах индекса от началото на масива за да сметне лявата сума, и +2 за дясната, обаче така се изпуска последната комбинация, когато сумата на всички елементи от ляво е равна на наи-десния елемент. Ето и правилното решение, където индекса е средното число, спямо което сумираме лявата и дясната страна :)

http://pastebin.com/fXxypHgh

 

2
jish91 avatar jish91 3 Точки

Най лесно отговор е:

var nums = Console.ReadLine().Split(' ').ToList();
            var result = new int[nums.Count];

            for (int i = 0; i < nums.Count; i++)
            {
                var element = "";
                foreach (var item in nums[i])
                {
                    element = item + element;
                }
                result[i] = int.Parse(element);
            }
            Console.WriteLine(result.Sum());

Извинявам се че го дават така.

 

0
WifiAvivi avatar WifiAvivi 151 Точки

Стана ми интересно как горното ще работи, но явно това решение е за друга задача.

Ето и моето решение на ниво Programming Fundamentals: http://pastebin.com/6VuVBU1a *

*return-а намалява времето за изпълнение наполовина.

1
11/09/2016 14:02:54
spiderbait90 avatar spiderbait90 63 Точки

Моето решение ми дава 80/100 в Judge ,а работи безотказно....тествах го с всякакви вариянти.Някой би ли могъл да ми открие грешката,ако изобщо има такава.

Цък :)

0
thelad43 avatar thelad43 14 Точки

Знам, че темата е писана отдавна, но вижте моето решение. Много по - лесно е и дава 100/100

https://pastebin.com/cb5W0QJb

0
gmanolov avatar gmanolov 5 Точки

Много по-лесно е, защото само имената на двете задачи съвпадат :D Иначе нямат нищо общо, продължавай да решаваш, за да коментираме и ние след време тяхната задача. 

0
thelad43 avatar thelad43 14 Точки

Лоолл, то наистина друга задача.. А аз се изкефих, че съм измислил нещо доста лесно и работи хахха

0
29/04/2017 22:41:15
andy94 avatar andy94 58 Точки

Здравейте имам 1 много тънко въпросче към задачата ето го кода https://pastebin.com/yiF28vdA (знам че не съм направил проверка но въпроса ми е друг.) . Как така на 1вата итерация на цикъла като съм дал leftSum = numbers.take(i) == 0 ? Не трябва ли да е == 10 ей това аз немога да си го обясня и отдоло righstum като имам skip(i + 1) ==  си работи напълно коректно 10ката я няма но защо я няма в лявата сума немога да разбера благодаря.

0
11/10/2017 15:39:17