Софтуерно Инженерство
Loading...
rpopova avatar rpopova SoftUni Team 45 Точки

[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 ето и условието :) 
 
Благодаря предварително 

Тагове:
RumenVasilev avatar RumenVasilev 103 Точки

Ще използвам темата на клежката за да не пускам друга тема. Само на мен ли ми дава 83/100 точки на задачата SumOfElements ot Exam 11 april 2014 Morning? Убих си 1 час пробвайки всевъзможни решения, докато накрая не пейстнах и авторското решение на което също ми дава 83 точки. Питам не защото е кой знае какъв проблем, но все пак е хубаво да се оправи, защото на изпита, ако се случи ще е малко гадно :)

0
nikola.m.nikolov avatar nikola.m.nikolov 832 Точки

Да и аз сега пробвах с авторовото решение и ми дава 83. Ето моето решение, което дава 100/100:

SumOfElements

0
Filkolev avatar Filkolev 4501 Точки

И аз при първия събмит съм имал 83/100, след това съм нанесъл промяна, доколкото виждам съм ползвал първия път масив от int, а след това съм го променил на масив от long и получавам вече 100/100. Промяната съм я направил веднага след първия събмит и честно казано не знам защо така ми е хрумнало да го направя, но е сработило. 

1
nikola.m.nikolov avatar nikola.m.nikolov 832 Точки

Именно в използването на int е проблема в авторовото решение. По условие всяко число може да е до 2 000 000 000 и да имаме до 1 000 числа. Сумата на 1 000 такива максимални числа надвишава int.

0
Filkolev avatar Filkolev 4501 Точки

Да, то е ясно, че сумата ще надвиши 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 точки без реално да съм разбрал напълно защо първото ми решение не е сработило. По-добре късно отколкото никога :)

1
RumenVasilev avatar RumenVasilev 103 Точки
Супер включване колеги! Въобще не бях обърнал внимание за широчината на числото! Вече свети червената лампичка :) @Filkolev, абсолютно си прав за L след двойката, няма по- добро решение. По- интересното в случая за мен е, защо авторското решение е с int? Явно някой не си пробва кода :D
0
Filkolev avatar Filkolev 4501 Точки

Ето в крайна сметка решението ми: Pastebin.

Имах и друг вариант, ползвайки Linq и методите за конвертиране на всички елементи на масив от string към int - Array.ConvertAll, както и за сумиране на елементите Sum(). Но този начин го подкарах само като запазих числата в long масив, защото в противен случай Sum() дава overflow exception в някои тестове. Иначе малко намалява броя редове, но пък увеличава използваната памет с 1МБ, така че няма много смисъл да се прави така. А и не ми се занимава повече с тази задача, мисля, че научих каквото можах от нея.

0
kiso_blg avatar kiso_blg 56 Точки

При въвеждане на максималния вход по условие 12:59 АМ 23:59 не ти връща отговор.

0