Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.01.2016, 08:57   #1
Programmer121
Пользователь
 
Аватар для Programmer121
 
Регистрация: 05.12.2014
Сообщений: 12
По умолчанию оптимизация кода

Помогите оптимизировать код
Код:
  int n,a,b,c,d,k=0,i,j;
    cin>>n>>a>>b>>c>>d;
    for(i=a;i<=b;i++){
        for(j=c;j<=d;j++)
            if(i+j==n) k++;
            }
    cout<<k;
имеются два цикла что замедляет программу.помогит обойтись хотя бы одним циклом...
задача...
Найти количество правильных сложений чисел из отрезков [a;b] и [c;d] которые равны числу n. то есть если i принадлежит отрезку [a;b] и j отрезку [c;d] то если i+j==n то k++;
и вывсети количество таких правильных сложений. то есть вывести k

Последний раз редактировалось Stilet; 12.01.2016 в 09:11.
Programmer121 вне форума Ответить с цитированием
Старый 12.01.2016, 09:10   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

1. для каждого числа i из [a;b] существует РОВНО ОДНО число дающее в сумме с ним число n. { = n-i }
2. оно может попасть (или НЕ попасть) в другой отрезок [c,d]
3. осталось "понять" КАК проверить что оно ПРИНАДЛЕЖИТ нашему отрезку { с<=n-i<=d }
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 12.01.2016 в 09:16.
evg_m вне форума Ответить с цитированием
Старый 12.01.2016, 09:12   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

так зачем тут два цикла?! В одном проверяйте, находится ли n-i в нужном диапазоне!

примерно так:
Код:
for(i=a;i<=b;i++){
j:=n-i;
if((j>=c)&&(j<=d)) k++;
}

p.s. а вообще, думаю, что тут вообще без циклов обойтись можно, если в коде сделать анализ взаимного расположения границ отрезков.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.01.2016, 09:15   #4
Programmer121
Пользователь
 
Аватар для Programmer121
 
Регистрация: 05.12.2014
Сообщений: 12
По умолчанию

спасибо большое!

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

Можно еще больше ускорить программу?

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
так зачем тут два цикла?! В одном проверяйте, находится ли n-i в нужном диапазоне!

примерно так:
Код:
for(i=a;i<=b;i++){
j:=n-i;
if((j>=c)&&(j<=d)) k++;
}

p.s. а вообще, думаю, что тут вообще без циклов обойтись можно, если в коде сделать анализ взаимного расположения границ отрезков.
как обойтись без циклов?

Последний раз редактировалось Stilet; 12.01.2016 в 11:15.
Programmer121 вне форума Ответить с цитированием
Старый 12.01.2016, 09:30   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Programmer121 Посмотреть сообщение
как обойтись без циклов?
ну у тебя же a,b,c,d - это целые числа?
при этот строго a<b и c<d ?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.01.2016, 09:37   #6
Programmer121
Пользователь
 
Аватар для Programmer121
 
Регистрация: 05.12.2014
Сообщений: 12
По умолчанию

ну да...что дальше?
Programmer121 вне форума Ответить с цитированием
Старый 12.01.2016, 13:51   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

| [a;b] ∩ [n-d;n-c] | (мощность множества)
= max(a, n-d) - min(b, n-c)
НО не всегда, а только если есть пересечение (т.е. множество НЕ ПУСТОЕ) иначе =0
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 12.01.2016 в 13:55.
evg_m вне форума Ответить с цитированием
Старый 12.01.2016, 17:37   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

evg_m, спасибо большое!!!
я именно это и пытался утром сказать. но не смог: додумать мысль до конкретной реализации не хватило ума и времени...
Оставил это себе на ужин...

единственное, если я правильно понимаю, количество должно быть
max(a, n-d) - min(b, n-c) +1
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оптимизация кода INSIDER73 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 16.12.2014 08:23
Оптимизация кода HDMI PHP 16 22.10.2012 13:06
Оптимизация кода LuckyTheGreat C# (си шарп) 3 15.07.2011 00:46
Оптимизация кода viscas PHP 3 31.05.2009 16:04
Оптимизация кода nusik Общие вопросы Delphi 2 21.05.2009 17:55