[Exam Problems] C# Basics - Exam Schedule
Здравейте,
ето решението ми https://github.com/rozay/rozay/issues/1 , искам да попитам някой има ли идея защо не ми минава 4тия тест в judge-a ? Изтеглих си рар-а с тестовете и вкарах input-a от 4тия тест и на моята машина си дава правилния резултат. http://judge.softuni.bg/Contests/7/CSharp-Basics-Exam-12-April-2014-Evening ето и условието :)
Благодаря предварително
Да и аз сега пробвах с авторовото решение и ми дава 83. Ето моето решение, което дава 100/100:
SumOfElements
И аз при първия събмит съм имал 83/100, след това съм нанесъл промяна, доколкото виждам съм ползвал първия път масив от int, а след това съм го променил на масив от long и получавам вече 100/100. Промяната съм я направил веднага след първия събмит и честно казано не знам защо така ми е хрумнало да го направя, но е сработило.
Именно в използването на int е проблема в авторовото решение. По условие всяко число може да е до 2 000 000 000 и да имаме до 1 000 числа. Сумата на 1 000 такива максимални числа надвишава int.
Да, то е ясно, че сумата ще надвиши int, затова декларирам променливите sum и minDiff, които слагам от тип long. Оказва се обаче, че самите числа (които са в рамките на int) като ги запазя в масив от int-ове, след това сметките не излизат правилно. Не ми смята програмата добре minDiff и в момента се мъча да разбера защо точно.
Решил съм си проблема, като и самите входни числа запазвам като long в масив. Така вече сметките са коректни и задачата ми дава 100 т. Но не мога за момента да разбера защо първият начин гърми на последните два теста, та сега с това се занимавам.
Едит: Улових къде става грешката. Правя проверка дали текущата разлика на елементите е по-малка от най-малката към момента ето така:
else if (Math.Abs(sumOfElements - 2 * numbers[i]) < minimumDiff)
{
minimumDiff = (long)Math.Abs(sumOfElements - 2 * numbers[i]);
}
Само че този израз: sumOfElements - 2 * numbers[i] дава грешен резултат в проверката. Ако след двойката сложа L да покажа, че е long тогава вече всичко е наред и отпада нуждата да запазвам числата като long. Явно трябва в този израз поне едно от двете числа (2 или numbers[i]) да е от тип long, за да се сметне разликата правилно.
Предполагам, че самият израз 2*numbers[i], понеже съдържа само int-ове, се счита за int, но 2*2 000 000 000 препълва int-a. В случая бях си изкарал 100 точки без реално да съм разбрал напълно защо първото ми решение не е сработило. По-добре късно отколкото никога :)
Ето в крайна сметка решението ми: Pastebin.
Имах и друг вариант, ползвайки Linq и методите за конвертиране на всички елементи на масив от string към int - Array.ConvertAll, както и за сумиране на елементите Sum(). Но този начин го подкарах само като запазих числата в long масив, защото в противен случай Sum() дава overflow exception в някои тестове. Иначе малко намалява броя редове, но пък увеличава използваната памет с 1МБ, така че няма много смисъл да се прави така. А и не ми се занимава повече с тази задача, мисля, че научих каквото можах от нея.
http://pastebin.com/dpk7xj3T 83/100 https://judge.softuni.bg/Contests/Practice/Index/7#0 - 01. Exam Schedule
Защо имам 83/100???
При въвеждане на максималния вход по условие 12:59 АМ 23:59 не ти връща отговор.