Loading...
m.nikolov97 avatar m.nikolov97 25 Точки

06. Closest Numbers

Здравейте, колеги!

Днес си решавах домашното, но срещнах проблем със 6-та задача. При мен работи перфектно, но judge ми дава 40/100.  В единия случай (Zero Test #1) с test input  

5

1 105 10 100 3

ми дава, че моят output е 1, а при мен излиза 2, както и е отговорът на задачата. Кодът ми е: https://pastebin.com/BACqB3fF.

Ще съм много благодарен, ако някой ме посъветва как да постъпя в ситуацията!

Тагове:
0
C++ Fundamentals
andreiko489 avatar andreiko489 17 Точки
Best Answer

Когато проверяваш дали елемента не се сравнява със себе си, тоест когато правиш проверката "if (i != k)"
в тялото на тази проверка трябва да извършваш и актуализацията на "absRecord", тъй като в твоя случай това е променливата, която съхранява най-малката абсолютна разлика на елементите, която търсиш по условие. В кода от линка, който си оставил, това се извършва извън това тяло и не винаги актуализацията е коректна. В твоя случай е:

if (i != k) {

    absMin = abs(numbers[i] - numbers[k]);
   }

   if (absMin < absRecord) {
    absRecord = absMin;
   }

a би трябвало да е:

if (i != k) {
    absMin = abs(numbers[i] - numbers[k]);
  

   if (absMin < absRecord) {
    absRecord = absMin;
   } }

Преместването на една къдрава скоба оказва ключово значение за логиката.
Като добавка е хубаво да се изкоментира, че инициализираш вектор, който никъде не използваш. Също така не именуваш хубаво променливите и това допълнително може да те обърка. Ако анализираме алгоритъма ти ще стигнем до извода, че решаваш задачата със сложност О(n^2) тоест за n елемента извършваш n^2 операции, което е адски много. Като идея би било хубаво първоначално да сортираш данните в колекцията, което би ти струвало n.log(n) с хубав алгоритъм и после да обходиш само веднъж масива, което пък ще е с линейна зависимост О(n), която е по-малка от тази за сортировката и няма да повлияе на предходната сложност и за оптимизация всеки път когато намериш два еднакви последователни елемента директно ще принтираш 0 на конзолата и ще приключваш с програмата.

0
17/09/2019 19:40:57
Hyulia avatar Hyulia 2 Точки

Здравей, най-напред едната ти грешка идва от това, че вторият ти if реално трябва да бъде вложен в първия и там където имаш absMin<absRecord трябва да е и равно, също така когато създаваш масив е най-добре да създадеш една константна променлива, която ще ти държи размера да речем const int maxSize=100; това долу  смятам, че е добър подход за създаване на масив :)

#include <iostream>

using namespace std;
const int maxSize=100;

 

int main()
{
    int arr[maxSize]={0};
    int n;
    cin>>n;

    for (int i=0; i<n; i++)
    {
        cin>>arr[i];
    }
    
 

 


    return 0;
}

 

1
17/09/2019 19:43:39
galin_kostadinov avatar galin_kostadinov 166 Точки

Привет!

Може да е само едно число.

Добави тази проверка:

    if (len == 1) {
        minValue = 0;
    }

Поздрави!

0
DimitarKazakov avatar DimitarKazakov 17 Точки

Благодаря ти много колега. Това беше проблема.

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