Loading...
LardaX avatar LardaX 15 Точки

06. Robotics

Здравейте. Имам проблем с 6та задача от Java Advanced, Stacks and Queues Exercises. Кодът ми работи в Judge, но дава 80 точки, като при последната проверка гърми за време. Предполагам, че проверката е свързана със задаване на прекалено голямо време за обработка на продукт при някой от роботите, но не мога да измисля как може да бъде съкратено това време. Идеи или подсказки?

Също бих се зарадвал ако някой предложи идея за решение БЕЗ класове, тъй като трябва да се води, че още не сме ги взели в Java и правилният вариант за решение е без тяхната употреба.

Благодаря предварително.
http://pastebin.com/vxUtRUt2

P.S. Не мога да повярвам, че не открих тема за тая задача :D 

0
Java Advanced
iludart avatar iludart Trainer 14 Точки
Best Answer

Здравей,

Ако искаш да я решиш без класове, можеш да пробваш с три масива. Единият за имената на роботите, един за бързината на всеки и един с броячи (които засичат време на всеки робот, когато започне да обработва нещо). По този начин, данните за всеки робот ще отговарят на един единствен индекс.

Поздрави,

0
LardaX avatar LardaX 15 Точки

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

0
AntonPortenov avatar AntonPortenov 102 Точки

Защо не пробваш да замениш List<Robot> с LinkedHashMap<String,Integer>. Ще имаш един counter, които ще върти времето иначе казано всеки цикъл ще е 1 секунда. Така ще въртиш стойностите и ще си спестиш доста памет. А отностно кой е свободен -един HashMap<String,boolean>. Тук ще променяш кой е свободен и кой не.

1
22/01/2017 15:00:07
LardaX avatar LardaX 15 Точки

Благодаря, ще опитам и така. Но искам първо да пробвам варианта с клас да проработи

0
AntonPortenov avatar AntonPortenov 102 Точки

Класовете са удобни и лесно четими, но нр случайно имаш лимит за време. Идеята е да мислиш различно, да намериш начин да си оптимизираш кода максимално. Всичко е в плюс. Пробвай дори да махнеш скенера и използваш BufferedReader, защото скенера е в пъти по бавен при по-големи вход данни.

0
Vladix avatar Vladix 75 Точки

Здравей, 

Така като ти гледам кода ти първо четеш всичките продукти и след това започваш да итерираш върху тях (и ги сетваш на none)  т.е поне два пъти като минимум на цялата колекция. Една добра оптимизация е ако четеш продуктите и веднага и проверяваш дали има свободен робот. Ако има принтиш. Ако няма, само че, го пъхаш в един стек и продължаваш към следващите продукти. След това като ти подадат End командата сприраш да четеш продукти и започваш да попваш от стека докато size > 0 и пак продължаваш -> проверяваш дали има свободен робот... т.н

 

Така на мен ми се получи и одарих точно 0.1секунди на последния тест.

Поздрави

0
LardaX avatar LardaX 15 Точки

Утре ще го пробвам тоя вариант. Принципно първоначално не правих 2 отделни итерации, а всичко наведнъж - while-а ми беше, докато комантада е различна от End и докато стека е size > 0, обаче по този начин трябваше да добавя и един if product == "End", за да не го добавям в стека и да не чета от конзолата и предполагам, че тази if проверка бавеше много програмата. Доста по-логично е, както предлагаш просто после да доизпразня стека. Благодаря

0
LardaX avatar LardaX 15 Точки

Пробвах обаче по някаква причина ми разбърква поредността в стека и примерно на втория тест 2 детайла излизат обърнати..
http://pastebin.com/wcRRRWf0

0
Vladix avatar Vladix 75 Точки

Използвай ArrayDeque като опашка а не като стек и ще си идват в реда който трябва. removeFirst() ако няма свободен робот addLast() и така докато се изпразни...

0
Simeon_Simeonov avatar Simeon_Simeonov 3 Точки

Здравейте, и аз искам да се възползвам от темата.

При мен минава само нулевите тестове и аз не можах да измисля тест при който да се счупи.

Това ми е кода: http://pastebin.com/ar0Mwq3u

Благодаря!

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