Loading...
l000p avatar l000p 13 Точки

90/100 Задача Bus. C++

Здравейте, пробвах какво ли не, но повече от 90 точки не мога да получа. 

Задачата е https://judge.softuni.bg/Contests/Compete/Index/1037#3.

По-точно, гърми ми тест номер 10. Някой има ли информация какво проверява този тест??

Няма да давам моето решение все още, защото може да разваля на някой "забавата" при решаване, ако някой иска да го обсъдим може да ме намери на facebook линка в профилът ми. На мен задачата ми се стори доста трудна...

Не знам тези междинни тестове съобразени ли са с текущите ни знания или са извадки от минали изпити ? 


Поздрави!
 

Тагове:
0
C++ Fundamentals
AlexanderHr avatar AlexanderHr 18 Точки

Ако гърми заради скоростта на програмата, тогава най-вероятно трябва да сложиш

cin.tie(0);

ios_base::sync_with_stdio(false);

в началото на main() функцията.

Ако е заради мемори лимит един добър хинт е, че задачата може да се реши с около 20на byte-a.

0
l000p avatar l000p 13 Точки

Здравей, не е time limit, a incorrect answer... 

0
AlexanderHr avatar AlexanderHr 18 Точки

Може да използваш този тестер, но не знам дали ще хване твоята грешка.

#include <iostream>
#include <ctime>
#include <sstream>

pair<string, string> testGen(int numGenes){
    if(numGenes%2==0)return make_pair("","");
    srand(time(0));
    string r = "0123456789abcdef", leader = string(5,'f'), res;
    res.reserve(numGenes*5+1);
    for(auto & c:leader) c = r[rand()%16];
    numGenes = (--numGenes)/2;
    int leaderIsIn = rand()%numGenes;
    for(int i = 0; i < numGenes;){
        for(int j=0;j<5;j++) res.push_back(r[rand()%16]);
        int times = max(1,rand()%(numGenes-i+1));
        for(int j=0; j<(times*2-1); j++)res+=res.substr(res.size()-5,5);
        i+=times;
        if(leaderIsIn <= i)res+=leader, leaderIsIn=1e9;
    }
    return make_pair(res+'.',leader);
}

int main()
{
    auto test = testGen(4194241);
    string correctAnswer = test.second;
    auto ss = istringstream(test.first);
    streambuf* stream_buffer_cin = cin.rdbuf(ss.rdbuf());
    ...

И после твоят код. Ако не хване грешката, тогава ето ти pastebin с моето решение:

https://pastebin.com/CFC8uvTS

0
24/09/2019 17:11:36
l000p avatar l000p 13 Точки

Здравей, това решение не е ли за следващата задача :) ? 

0
mitakvd avatar mitakvd 7 Точки

Хващаш ли граничния случай, когато разликата е нула? Може това да е проблема. 

0
l000p avatar l000p 13 Точки

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

0
mgskabrina avatar mgskabrina 2 Точки

Привет, нямам решение, а по-скоро успокоение -  и при мен е така.

Как ли не го мислих - гърми си точно този тест - тест № 10.

Мислих го и ако имаме само 1 автобус, ако и двете времена са точно в полунощ - но на практика отговорите са такива, каквито очаквам. 

0
l000p avatar l000p 13 Точки

Следващата е "по-приятна", аз я направих с 2d вектори като проверявам с вложен цикъл дали нововъведеният вектор в матрицата, съвпада с някой от вече въведените, ако съвпадне .erase-вам нововъведеният и този с който съвпада, за съжаление не е много успешен подход, защото при голям input се получава и доста обемена матрица...  съответно взимам и малко точки. 

Колегата по-горе е дал решение, но разбирам точно нищо от него, ще трябва да се чете още.

Някой от колегите дали знае този примерен изпит върху знания, които тепърва ще придобием ли е или е насочен към знанията, които имаме до момента?

0
MartinBG avatar MartinBG 4803 Точки

@l000p - задача като Roxettes със сигурност няма да имате на изпита, защото който е запознат с логическите оператори и свойствата им ще я направи бързо, а всички останали ще забият на нея за неопределено време.

По-интересен вариант на Bus беше даден като първа задача на изпит през 2017.

0
l000p avatar l000p 13 Точки

Здравей MartinBG, логическите оператори не бяха ли "&&; ||; !n" ?? Да нямаш на предвид операторите за присвояване? 

Отговорът ти малко ме обезпокои и успокои :D 

0
dmartinov avatar dmartinov 37 Точки

Не знам дали не се включвам малко късно и дали съответно вече не си се справил със задачата, но ако не си, се надявам да мога да ти подскажа. Та, моята подсказка е следната (това е и начина по който аз я реших и ми даде 100 точки) - направи си променлива, която да използваш като чек сума дали часът те удоволетворява. Така минаваш с една единствена проверка. И сега най-голямата ми подсказка - не съм конвертирал стойностите на масива съдържащ разписанията нито в минути, нито в часове нито в каквито и да било мерни единици за време. 

В краен случай, ако зациклиш и не намериш правилната пътека - прати ми скайп например (нямам фейсбук) и ще обсъдим решението и може да ти покажа моето.

0
l000p avatar l000p 13 Точки

Предполагам, че все пак ги конвертираш до цяло число, пример: 0145 става 145. След което проверяваш кое от въведените е най-близо до часа на влака и изввеждаш това като отговор ? Каква променлива използваш за съхранение на "чек сума", вектор ??

П.С: За съжаление не използвам Скайп платформата от години. Дори не си помня креденциалите. Все пак можеш да ме намериш с outlook mail-a ми, доколкото помня Win 10 имаше някаква вградена lite версия .. loopgrpltd@outlook.com

0
dmartinov avatar dmartinov 37 Точки

Няма нужда да конвертираш подобно число ако го записваш в int, тъй като вкарваш целочислена стойност, а едно число няма как да има водеща 0. Ако беше стринг например, тогава щеше да запише всички символи или ако беше floating point число може да е 0,05 например. Та, ако в int запишеш 0145 той всъщност ще съдържа стойността 145.

Относно чек сумата - не виждам смисъл в използването на вектор. Ползвам int в който пазя най-малкото положително време за чакане. Когато го намеря си запазвам и съответната позиция от масива с разписанията на часа който ми дава това.

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