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

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

24.04.2018, 21:58. Просмотров 979. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.04.2018, 21:58
Ответы с готовыми решениями:

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

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

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

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

27
47 / 31 / 21
Регистрация: 04.04.2016
Сообщений: 209
24.04.2018, 22:11 2
C++
1
2
3
int main() {
    return 0;
}
0
469 / 422 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
24.04.2018, 22:34 3
_Milk_, насчет упросить конечно надо смотреть, но то, что mas всегда возвращает 0 - это факт)
C++
1
2
3
4
5
double mas(double ai, double bi, double ci, double a1i, double b1i, double c1i) 
{
   ...   
    return 0;
}
А насчет упростить - напиши для начала задачу.
0
Эксперт C
24939 / 15439 / 3271
Регистрация: 24.12.2010
Сообщений: 33,297
24.04.2018, 23:01 4
Цитата Сообщение от _Milk_ Посмотреть сообщение
как можно упростить данный код?
Активнее использовать массивы.
0
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
24.04.2018, 23:16 5
C++
1
2
3
4
5
6
7
8
9
for (i = 0; i < n; i++) {
   cin >> a[i] >> b[i] >> c[i];
   a1 += a[i];
   b1 += b[i];
   c1 += c[i];//ищем среднее арифметическое каждого из элементов массивов
}
a1 /= n;
b1 /= n;
c1 /= n;
меньше деления - быстрее работает. О - оптимизация
1
Эксперт C
24939 / 15439 / 3271
Регистрация: 24.12.2010
Сообщений: 33,297
25.04.2018, 10:53 6
Поясню, что я имел в виду
Цитата Сообщение от Байт Посмотреть сообщение
Активнее использовать массивы.
C++
1
2
3
4
5
6
7
double mas(double axi[], double ax1i[]) 
{
    double call = 0;
    for(int i = 0-; i<3; i++) 
      call += abs(axi[i] - ax1i[i]);
    return call;
}
Ну и так далее...
Имена для массивов, конечно, следует подобрать более содержательные...
0
0 / 0 / 1
Регистрация: 16.01.2018
Сообщений: 75
25.04.2018, 19:27  [ТС] 7
Цитата Сообщение от SuperKir Посмотреть сообщение
_Milk_, насчет упросить конечно надо смотреть, но то, что mas всегда возвращает 0 - это факт)
C++
1
2
3
4
5
double mas(double ai, double bi, double ci, double a1i, double b1i, double c1i) 
{
   ...   
    return 0;
}
А насчет упростить - напиши для начала задачу.
Вот условие
0
Вложения
Тип файла: pdf document.pdf (86.7 Кб, 8 просмотров)
0 / 0 / 1
Регистрация: 16.01.2018
Сообщений: 75
25.04.2018, 19:30  [ТС] 8
Цитата Сообщение от Байт Посмотреть сообщение
Поясню, что я имел в виду
C++
1
2
3
4
5
6
7
double mas(double axi[], double ax1i[]) 
{
    double call = 0;
    for(int i = 0-; i<3; i++) 
      call += abs(axi[i] - ax1i[i]);
    return call;
}
Ну и так далее...
Имена для массивов, конечно, следует подобрать более содержательные...
То есть для каждого модуля отдельный цикл?
0
Байт
25.04.2018, 19:41
  #9

Не по теме:

Цитата Сообщение от _Milk_ Посмотреть сообщение
То есть для каждого модуля отдельный цикл?
Имеющий уши - да слышит! Имеющий глаза - да видит! Не имеющий ни того, ни другого... Просто и не знаю, чем помочь...

0
0 / 0 / 1
Регистрация: 16.01.2018
Сообщений: 75
25.04.2018, 20:09  [ТС] 10
Цитата Сообщение от Байт Посмотреть сообщение

Не по теме:

Имеющий уши - да слышит! Имеющий глаза - да видит! Не имеющий ни того, ни другого... Просто и не знаю, чем помочь...

Ну сорян у меня опыта 0 лет сожалению, а в вас больше 10 лет
0
353 / 134 / 28
Регистрация: 16.12.2012
Сообщений: 607
Записей в блоге: 1
25.04.2018, 20:21 11
Цитата Сообщение от _Milk_ Посмотреть сообщение
Вот условие
Так дела не делаются.
Мне нужно скачать. Я уже недоволен. Потом мне нужно открыть. И я снова не в восторге. А потом окажется, что все на украинском. Мне придется копировать, чтобы загнать в переводчик. Но скопируется с pdf'ки отвратительно. И придется еще решать проблему с кодировкой. Мне банально лень.

Пляшем дальше. Оптимизировать. Это что значит?
Ускорить время работы? Найти контр пример? Еще что-то?

Как уже было сказано, функция возвращается всегда 0, а должна call
N <= 10^5
Массивы у тебя до 10^4-1
Ответ - целое число. У тебя дробное.
Как ты решаешь проблему с дробной частью мне непонятно. Думать - мне снова лень. Это не та задача, где нужно (можно) думать.. Так что я (все та же лень) писал бы алгоритм, который позволит мне не думать о правильности моего подхода. Потому что - он будет верным. (вроде как). Тернарный поиск для всех трех величин. Сложность 10^5*log(10^4). Будет летать
0
0 / 0 / 1
Регистрация: 16.01.2018
Сообщений: 75
25.04.2018, 20:31  [ТС] 12
Цитата Сообщение от Ромаха Посмотреть сообщение
Так дела не делаются.
Мне нужно скачать. Я уже недоволен. Потом мне нужно открыть. И я снова не в восторге. А потом окажется, что все на украинском. Мне придется копировать, чтобы загнать в переводчик. Но скопируется с pdf'ки отвратительно. И придется еще решать проблему с кодировкой. Мне банально лень.

Пляшем дальше. Оптимизировать. Это что значит?
Ускорить время работы? Найти контр пример? Еще что-то?

Как уже было сказано, функция возвращается всегда 0, а должна call
N <= 10^5
Массивы у тебя до 10^4-1
Ответ - целое число. У тебя дробное.
Как ты решаешь проблему с дробной частью мне непонятно. Думать - мне снова лень. Это не та задача, где нужно (можно) думать.. Так что я (все та же лень) писал бы алгоритм, который позволит мне не думать о правильности моего подхода. Потому что - он будет верным. (вроде как). Тернарный поиск для всех трех величин. Сложность 10^5*log(10^4). Будет летать
Ок, как бы ты ее реализовывал?

Борщ, картошка и салат
Сегодня в пласт учеников праздник! Привезли вдвое больше продуктов на обед. Зеник вместе с Маричкой
вызвались помогать на кухне. Всего есть три разных блюда: борщ, картошка и салат.
В пласт! в Зеника и Марички G N друзей. и - друг хочет съесть А: грамм бору, В, грамм картофеля
и Си грамм салата. Если друг Зеника и Марички хочет съесть Х грамм определенного блюда, а ему в
тарелку положили В грамм, то степень недоверия к Зеника с Маричкой у этого друга возрастет на
X - единиц. Ценнику с Маричкой приказали накладывать всем одинаковые порции определенного Блюда.
То есть каждому другу нужно наложить А грамм борща, В грамм картофеля и C грамм салата.
помогите Зенику и На реке выбрать такие А, В и С, чтобы суммарный степень недоверия всех
друзей был как можно меньшим.
Входные данные
В первой строке записано целое число N - количество друзей Зеника и Марички.
В следующих N строках записаны по три целых числа А, В, Си - количество бори, картофеля и
салата, которую хочет получить друг
Исходные данные
Одно целое число - суммарный степень недоверия всех друзей к Зеника и Марички.
0
353 / 134 / 28
Регистрация: 16.12.2012
Сообщений: 607
Записей в блоге: 1
25.04.2018, 20:39 13
Знаешь определение унимодальной функции? Смысл в том, что она должна сначала монотонно возрастать, дальше монотонно убывать. (или наоборот)
Как <я забыл. и гуглить лень. график функции a*x^2 >
Когда ты поймешь, что это так - гуглишь тернарный поиск. Разбираешься. Он точно есть на емаксе.
Писать его мне точно лень
1
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
25.04.2018, 21:03 14
если я правильно понял задачу, то как-то так:
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
int find_max(std::map<int, int>& x) {
   auto result = std::max_element(eat_a.begin(), eat_b.end(), 
      [](std::pair<int,int> lhs, std::pair<int, int> rhs) {
         return lhs.first * lhs.second < rhs.first * rhs.second;
      }
   );
   return result.first;
}
 
int main() {
   std::map<int, int> eat_a, eat_b, eat_c;
   int a, b, c;
   for (int i = 0; i < N; ++i) {
      cin >> a >> b >> c;
      ++eat_a[a];
      ++eat_b[b];
      ++eat_c[c];
   } 
 
   int A = find_max(eat_a),
       B = find_max(eat_b),
       C = find_max(eat_c);
 
   std::cout << A << " " << B << " " << C;
}
Поясню решение. Если друг хотел съесть 5 грамм, а ему дали 3, то недоверие увеличится на 5. Допустим таких человек будет 10, т.е. недоверие увеличится до 5 * 10 = 50. Таким образом, нам нужно найти максимальное произведение грамм, которых хочется, и числа таких друзей. Т.к. оно будет максимальным, то суммарное недоверие будет наименьшим
0
0 / 0 / 1
Регистрация: 16.01.2018
Сообщений: 75
25.04.2018, 21:04  [ТС] 15
Цитата Сообщение от Ромаха Посмотреть сообщение
Знаешь определение унимодальной функции? Смысл в том, что она должна сначала монотонно возрастать, дальше монотонно убывать. (или наоборот)
Как <я забыл. и гуглить лень. график функции a*x^2 >
Когда ты поймешь, что это так - гуглишь тернарный поиск. Разбираешься. Он точно есть на емаксе.
Писать его мне точно лень
Спасибо помогло. А еще один вопрос если можно как можно решать системы уравнений например круга?
0
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
25.04.2018, 21:16 16
_Milk_, по условию задачи искать среднее значение тут абсолютно не нужно. Вам нужно найти эту величину порций, а не взять от балды

Добавлено через 5 минут
P.S. Вместо
C++
1
auto result = std::max_element(eat_a.begin(), eat_b.end()
должно быть
C++
1
auto result = std::max_element(x.begin(), x.end()
не успел подправить

Добавлено через 1 минуту
и конечно же тяжелые параметры передаем по ссылке
C++
1
[](std::pair<int,int>& lhs, std::pair<int, int>& rhs)
0
0 / 0 / 1
Регистрация: 16.01.2018
Сообщений: 75
25.04.2018, 21:33  [ТС] 17
Цитата Сообщение от mat_for_c Посмотреть сообщение
если я правильно понял задачу, то как-то так:
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
int find_max(std::map<int, int>& x) {
   auto result = std::max_element(eat_a.begin(), eat_b.end(), 
      [](std::pair<int,int> lhs, std::pair<int, int> rhs) {
         return lhs.first * lhs.second < rhs.first * rhs.second;
      }
   );
   return result.first;
}
 
int main() {
   std::map<int, int> eat_a, eat_b, eat_c;
   int a, b, c;
   for (int i = 0; i < N; ++i) {
      cin >> a >> b >> c;
      ++eat_a[a];
      ++eat_b[b];
      ++eat_c[c];
   } 
 
   int A = find_max(eat_a),
       B = find_max(eat_b),
       C = find_max(eat_c);
 
   std::cout << A << " " << B << " " << C;
}
Поясню решение. Если друг хотел съесть 5 грамм, а ему дали 3, то недоверие увеличится на 5. Допустим таких человек будет 10, т.е. недоверие увеличится до 5 * 10 = 50. Таким образом, нам нужно найти максимальное произведение грамм, которых хочется, и числа таких друзей. Т.к. оно будет максимальным, то суммарное недоверие будет наименьшим
То есть если я вас правильно понял то допустим у нас есть 2 друга первый хотел съесть 10, а второй 20 то нам нужно 10 * 20, я правильно понял?
0
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
25.04.2018, 21:36 18
Цитата Сообщение от _Milk_ Посмотреть сообщение
То есть если я вас правильно понял то допустим у нас есть 2 друга первый хотел съесть 10, а второй 20 то нам нужно 10 * 20, я правильно понял?
Ваш перевод с украинского на русский не точен, и ряд условий пропало. В связи с чем решение подойдет только для вашего перевода
0
0 / 0 / 1
Регистрация: 16.01.2018
Сообщений: 75
25.04.2018, 21:41  [ТС] 19
Цитата Сообщение от mat_for_c Посмотреть сообщение
Ваш перевод с украинского на русский не точен, и ряд условий пропало. В связи с чем решение подойдет только для вашего перевода
Произведение ето вроде умножения
0
353 / 134 / 28
Регистрация: 16.12.2012
Сообщений: 607
Записей в блоге: 1
25.04.2018, 21:43 20
Цитата Сообщение от _Milk_ Посмотреть сообщение
А еще один вопрос если можно как можно решать системы уравнений например круга?
Смотря опять же для чего.
Для общего случая - гугли про численные методы.
Для частного - например, найти точку пересечения двух окружностей - тут отдельный разговор.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.04.2018, 21:43

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

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

Наследование классов как можно оптимизировать код и условие
Создал два класса родительский монстр и наследный демон. у демона появляется значение разум и...

Кажется написал ужасный код. Можно его как-то оптимизировать?
Решал одну задачку: Даны натуральное число n, целые числа x 1 , ..., x n (все числа попарно...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.