Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
0 / 0 / 1
Регистрация: 16.01.2018
Сообщений: 75

Как оптимизировать код

24.04.2018, 21:58. Показов 1902. Ответов 27
Метки нет (Все метки)

Доброй ночи господа у меня к вам такая просьба как можно упростить данный код?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <stdlib.h>
using namespace std;
 
double mas(double ai, double bi, double ci, double a1i, double b1i, double c1i) 
{
    double calla, callb, callc, call;
 
    calla = abs(ai - a1i);
    callb = abs(bi - b1i);
    callc = abs(bi - b1i);
    call = calla + callb + callc;
    
    return 0;
}
 
int main() {
 
    int n, i;
    cin >> n; //вводимо кількість "друзів"
    double a[10000], b[10000], c[10000], a1=0, b1=0, c1=0,k=0;
    for (i = 0; i < n; i++) {
        cin >> a[i] >> b[i] >> c[i];
        a1 += a[i] / n;
        b1 += b[i] / n;
        c1 += c[i] / n;//ищем среднее арифметическое каждого из элементов массивов
    }
 
    for (i = 0; i < n; i++) {
        k += mas(a[i], b[i], c[i], a1, b1, c1);//находим разницу между средним арифметическим и заданным числами и накапливают их
 
    }
    cout << k;
    system("pause");
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.04.2018, 21:58
Ответы с готовыми решениями:

Как оптимизировать код?
Как оптимизировать код, чтобы работала программа быстрее #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;iomanip&gt; using...

Как оптимизировать код?
мне нужно чтобы значения угла перебирались от начального до конечного в зависимости от времени, выдает ошибку, как сделать правильно...

Как оптимизировать код?
Вот такой код, написанный для микроконтроллера импульсного блока питания. Просто интересно мнение, что можно поменять и изменить для...

27
0 / 0 / 1
Регистрация: 16.01.2018
Сообщений: 75
25.04.2018, 21:54  [ТС]
Цитата Сообщение от Ромаха Посмотреть сообщение
Смотря опять же для чего.
Для общего случая - гугли про численные методы.
Для частного - например, найти точку пересечения двух окружностей - тут отдельный разговор.
Ну например два круга пересекаются и надо найти точки сечения тип и принадлежащей двум кругам
0
354 / 135 / 28
Регистрация: 16.12.2012
Сообщений: 607
Записей в блоге: 1
25.04.2018, 22:06
Еще раз. тебе нужно найти все такие (x, y), такие что (x-x0)^2+(y-y0)^2 <= r^2, (x-x1)^2+(y-y1)^2 <= r^2
либо только равно?
Ответ в первом случае - множество точек. Во втором либо ничего, либо одна точка, либо две. Добавь конкретики.

Для решения второй задачи хватает знаний школьной геометрии. И способов решений там, однако, много
0
0 / 0 / 1
Регистрация: 16.01.2018
Сообщений: 75
26.04.2018, 08:49  [ТС]
Цитата Сообщение от Ромаха Посмотреть сообщение
Еще раз. тебе нужно найти все такие (x, y), такие что (x-x0)^2+(y-y0)^2 <= r^2, (x-x1)^2+(y-y1)^2 <= r^2
либо только равно?
Ответ в первом случае - множество точек. Во втором либо ничего, либо одна точка, либо две. Добавь конкретики.

Для решения второй задачи хватает знаний школьной геометрии. И способов решений там, однако, много
Например дано два кола К(х=0,у=0 радиус 2) К1(х=0,у=2 радиус 2) нужно найти площу которая предналежит и первому и второму
Миниатюры
Как оптимизировать код  
0
354 / 135 / 28
Регистрация: 16.12.2012
Сообщений: 607
Записей в блоге: 1
26.04.2018, 11:41
о. Эт хорошая задача
Смотри.
Решать можно всяко. Можно устроить что-то вида разбиения на квадраты. Т.е. Давай запустим некую функцию f(x0, y0, x, y) (начальные параметры нужно тоже адекватно выбрать). Что делает наша f. Она смотрит. если все 4 точки квадрата(т.е. (x0, y0), (x0, y), (x, y0), (x, y)) лежат в области пересечения - то все возвращаем площадь квадрата. Если ни одна не принадлежит - возвращаем 0. Иначе разбиваем квадрат на 4 и снова считать в глубь. Чем-то похоже на квадродерево.
НО! Это долго или неточно (т.к. одно вытекает из другого)

Другой вариант пойти в интегралы
По фану (коли могешь) можешь посчитать ручками.
А можно сделать очень красиво. Называется вроде интегралы по Симсону (или нет. я не помню)
Смысл в чем. Давай посчитаем площадь всей фигуры (т.е. площадь объединения шаров)
Для определим функцию f(l, l+eps)
eps выбирается как тебе угодно (сколько хочешь точности. я ставил 1e-2)
f(l, r) будет считать площадь от l до r
Считать будет так.
C++
1
2
3
4
5
6
7
double a = g(l);
double b = g(r);
double m = g((l+r)/2);
if (abs(a-b) < EPS && abs(a-m) < EPS)
        return m*(r-l);
else
        return f(l, (l+r)/2) + f((l+r)/2, r);
g(p) будет считать площадь для "вертикальных прямых вида y = p
А делается это снова просто
Находишь точки пересечения y=p и окружностей
Добавлять 4 точки в массив. Сортируешь его. Ответ - сумма разностей между соседними элементами.

Тогда необходимая тебе область будет равно сумме площадей круга - наша насчитанная площадь
Ах да. Забыл (на всякий. вдруг это неочевидно) сказать. Что площадь ты также считаешь в цикле. т.е. double sum = 0; for (double l = что-то; l <= что-то; l+=eps) sum+=f(l, l+eps);
Конец
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
26.04.2018, 12:02
Цитата Сообщение от _Milk_ Посмотреть сообщение
Например дано два кола
_Milk_, для новой задачи создавайте новую тему

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <iomanip>
#include <cmath>
 
using namespace std;
 
int main()
{
    cout<< setprecision(9) << fixed <<"S="<<4*(2*asin(sqrt(3)/2)-sqrt(3)/2)<<endl;
system("pause");
return 0;
}
правда у меня ответ не сходится с Вашим в девятом знаке после запятой
0
354 / 135 / 28
Регистрация: 16.12.2012
Сообщений: 607
Записей в блоге: 1
26.04.2018, 16:41
Ах да. Я безбожно наврал.
Считать g(p) нужно по-другому. Для каждой окружности находим точки пересечения. Соль в том, что есть точка входа и точка выхода. Загоняем их в массив. Сортируем. Точка входа +1, выхода -1. Идем по массиву и насчитываем баланс. Если он в какой-то момент становится 1 (при +1), запоминаем вход. Если в какой-то момент становится равен 0 (при -1), прибавляем к ответу вход - данный выход.
Конец
0
354 / 135 / 28
Регистрация: 16.12.2012
Сообщений: 607
Записей в блоге: 1
27.04.2018, 23:28
Чет мне очень скучно стало..
Решение с средним не зайдет.
Например..
Дан массив {1, 2, 3, 4, 100}. Правильно выбранный элемент - 3.
Так что решать так нельзя.
Нельзя решать так, как я предлагал. Потому что функция неунимодальная. Наврал я опять. А ты ковано согласился. Не надо так..
А решается все очень и очень просто.
Поможет в это ограничение на a[i], b[i], c[i] <= 10^4
Ответ - f(a)+f(b)+f(c)
Решаем для одного массива (v)
Воруем идею у сортировки подсчетом
получаем массив p, где p[i] - количество элементов i в массиве v
Рассмотрим некое произвольное число k
Все элементы от 0 до k-1 при подсчете нашей суммы будут иметь вид (k-v[i])
Ничего нам не мешает вычислить количество элементов от 0 до k-1 (пусть их cnt)
Тогда первая часть суммы cnt*k-sum(0..k-1). Сумма элементов от 0 до k-1 считается частичными суммами
Разбираемся с элементами от k+1 до 10^4. Их вид в сумме v[i]-k
Их количество тоже можем узнать за O(1)
Их сумму можем узнать за O(1)
Вторая часть необходимой суммы sum(k+1..10^4)-cnt2*k
И так делаем для всех k = 0..10^4
Для каждого считаем за O(1)

Итог - 10^4+10^5 - за одну секунду ой как зайдет (ога. проверил. 0.092c 3.891мб)
0
0 / 0 / 1
Регистрация: 16.01.2018
Сообщений: 75
09.09.2018, 15:51  [ТС]
Ромаха, как тебе такое решение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <algorithm>
using namespace std;
 
int main()
{
 
    int n, a[10000], b[10000], c[10000], i, sum = 0;
    int maxa = 0, maxb = 0, maxc = 0, mina, minb, minc;
    int sra, srb, src;
    cin >> n;
    for (i = 0; i < n; i++)
    {
        cin >> a[i] >> b[i] >> c[i];
 
    }
    sort(&a[0], &a[n]);
    sort(&b[0], &b[n]);
    sort(&c[0], &c[n]);
 
    mina = a[0];
    minb = b[0];
    minc = c[0];
    maxa = a[n - 1];
    maxb = b[n - 1];
    maxc = c[n - 1];
 
    sra = (maxa + mina) / 2;
    srb = (maxb + minb) / 2;
    src = (maxc + minc) / 2;
    for (i = 0; i < n; i++)
    {
        sum += abs(a[i] - sra) + abs(b[i] - srb) + abs(c[i] - src);
    }
    cout << sum;
    system("pause");
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.09.2018, 15:51

Как можно оптимизировать код?
#include &lt;iostream&gt; #include &lt;algorithm&gt; #include &lt;vector&gt; using namespace std; int main() { int n, temp; cin&gt;&gt;n; ...

Как можно оптимизировать данный код?
И... Ещё один вопрос: Дан участок кода С++: #include &lt;iostream&gt; #include &quot;Windows.h&quot; using namespace...

Можно как-то оптимизировать этот код?
#include &lt;iostream&gt; using namespace std; int main() { unsigned int num, trueNum, a, howMany, endwrite, fail; fail = 0; ...

Как оптимизировать код, со множеством операторов if?
Можно ли сделать так, чтобы проверка обрабатывалась только тогда, когда нужно чтобы она проверила условие. while ( 1 ) { //...

Как оптимизировать данный код игры крестики нолики?
Привет всем! Я написал консольную игру &quot;Крестики нолики&quot;. Хочу посоветоваться как можно оптимизировать игру. Вот исходный код: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Новые блоги и статьи
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru