Loading...

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

Kris_Vasilev avatar Kris_Vasilev 0 Точки

07. Miners - Compile Time Error

Здравейте, колеги! От няколко дена ме мъчи последната задача от домашното за мапове и сетове и когато най - накрая я направих, се оказа, че е прекалено бавна в Judge системата. Много ще съм благодарен ако някой даде съвет как да оптимизирам кода. Надявам се да няма и логическа грешка.

Code: https://pastebin.com/Rymc93Ld

Тагове:
0
C++ Advanced 16/06/2021 00:37:09
Smeshan avatar Smeshan 89 Точки

Привет,
аз ще споделя какво намерих в кода:

1. В readInput() тази променлива std::string endOfVec = "stop"; не я ползваш никъде, може би си искал да я ползваш в while loop-a.

2. В putInMap() можеш директно да изтриеш къдете ползваш функцията convertStringToInt() и самата фунцкия направо, и да я смениш със stoi(). И да стане просто така:

int currNum = stoi(input[i + 1]);

Също аз бих сменил map.insert(std::make_pair(currWord, currNum)); с това map[currWord] = currNum; 
Отделно да сложа още един параметър на функцията std::vector<std::string>& resPrintOrder в който да пушвам всеки път като намеря нов ресурс:

std::map<std::string, int> putInMap(const std::vector<std::string>& input,
                                    std::vector<std::string>& resPrintOrder) {
	std::map<std::string, int> map;
	for (size_t i = 0; i < input.size(); i += 2) {
		std::string currWord = input[i];
		int currNum = stoi(input[i + 1]);
		auto pair = map.find(currWord);
		if (pair == map.end()) {
			map[currWord] = currNum;
			resPrintOrder.push_back(currWord);
		}
		else {
			int sum = pair->second + currNum;
			pair->second = sum;
		}
	}
	return map;
}

3. В sortMap() бих въртял for loop в resPrintOrder и следователно да махна map.erase(pair); 

void sortMap(const std::map<std::string, int>& map,
			 const std::vector<std::string>& resPrintOrder) {
	size_t size = resPrintOrder.size();
	for (size_t i = 0; i < size; i++) {
		std::string currWord = resPrintOrder[i];
		auto pair = map.find(currWord);
		std::cout << pair->first << " -> "
			<< pair->second;
		std::cout << std::endl;
	}
}

И кода минава 100/100 :)

Според мен всичко проблеми идват накрая като въртиш при принтирането в input-a. Защото той може да е 2000 ентрита а да имаш само 3-4 ресурса. И ти още на първото завъртване да намериш Gold (примерно) и да го принтираш и да го изтриеш, но в инпута можеш да имаш Gold още 1500 пъти.
Отделно при мен ми гърми кода на 2 теста и предполагам е защото ти липсва проверка за map.find() дали е равна на map.end() (пак в същата фунцкия sortMap), тъй като ти може да си изтрил Gold (примерно) и какво става ако мине пак Gold през инпута - не го намира в мап-а. И после триеш нещо, което не си намерил, но не съм много сигурен тук какво става, но със сигурност не ми изглежда окей :)

Надявам се съм ти помогнал.

Поздрави,
Илиян

1
16/06/2021 19:57:41
Kris_Vasilev avatar Kris_Vasilev 0 Точки

Благодаря много, колега, за изчерпателния отговор!

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