Задача 2
Задача 3
Задача 4
Задача 5
Здравейте,
Ето и впечатленията ми от втората задача на изпита.
Условието на задачата може да изтеглите от тук: 2. Drunken Numbers.doc
Тази задача ми се стори лесна и започнах с нея, но не я направих от първия път :).
Искаше ми се да опиша целия път на всяка от задачите и трудностите които срещнах, но в момента нямам достъп в bgcoder до всички предадени варианти и техния код ще го карам малко наизуст.
Първо я направих с тип int за сумата на бирите за всеки от участниците. В последствие се оказа че не стига и сложих long, дори в крайна сметка го оставих с ulong понеже си е положително число.
В началото си запазвах входа в стринг. След това чистех нулите отпред както е описано и обхождах стринга един път до средата и натрупвах сумите едновремено за двата играча. Накрая просто сравнявах и печатах правилното в случаите.
Но все на 70 точки стоях.
Пренаписах програмата да взимам числата с int.Parse - тук беше момента в който разбрах че int не стига. Това добре но типа не помогна, дори опитах с BigInteger и пак не помогна.
По едно време ми хрумна че може да има други символи, макар че BigInteger.Parse и ulong.Parse минаваха. Опитах да извлека от стринга само символите от 0 до 9. Тук една грешка ми изигра лоша шега и ми отне много още мислене и чудене защо още съм на 70 точки.
След доста лутане забелязах че първо чистя нулите отпред и после извличам от стринга само цифрите. След като им смених местата и най-накрая 10 мин. преди края на изпита - 100 точки.
Евала. Невероятно облекчение.
Ето и моето решение:
using System; using System.Text; class DrunkenNumbers { static void Main() { int rounds = int.Parse(Console.ReadLine()); ulong countMitko = 0; ulong countVladko = 0; for (int round = 0; round < rounds; round++) { string drunkenNumber = Console.ReadLine(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < drunkenNumber.Length; i++) { if (drunkenNumber[i] >= '0' && drunkenNumber[i] <= '9') { sb.Append(drunkenNumber[i]); } } drunkenNumber = sb.ToString().TrimStart(new Char[] { '0' }); int length = drunkenNumber.Length / 2 + drunkenNumber.Length % 2; for (int index = 0; index < length; index++) { if (drunkenNumber[index] >= '0' && drunkenNumber[index] <= '9') { countMitko += (ulong)(drunkenNumber[index] - '0'); } if (drunkenNumber[drunkenNumber.Length - 1 - index] >= '0' && drunkenNumber[drunkenNumber.Length - 1 - index] <= '9') { countVladko += (ulong)(drunkenNumber[drunkenNumber.Length - 1 - index] - '0'); } } } if (countMitko > countVladko) { Console.WriteLine("M {0}", (countMitko - countVladko)); } else if (countMitko < countVladko) { Console.WriteLine("V {0}", (countVladko - countMitko)); } else { Console.WriteLine("No {0}", (countMitko + countVladko)); } } }
Здравей, колега!!! Поздравления за блога.
ОтговорИзтриванеСпоред мен причината хората с верен алгоритъм да са масово с по 70 точки е че гърмят три теста с вход, в който има отрицателно число. Аз също бях на 70% и се усетих, че реално нас ни интересува цифрата на последния остатък при деление на 10 и ако той е с минус реално ще го извадим а не съберем. След това парснах числото по абсолютна стойност и резултата ми се промени на 100.
Успех в академията....