Задача 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.
Успех в академията....