Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Vaderkos
76 / 76 / 3
Регистрация: 31.03.2015
Сообщений: 435
#1

Оптимизировать и ускорить программу - C++

10.01.2016, 16:47. Просмотров 163. Ответов 0
Метки нет (Все метки)

Оптимизировать и ускорить программу. Нужно любое увеличение скорости работы. Может циклы как то подрихтовать, или количество переменных уменьшить. Что она делает.

Дана квадратная матрица M размера n, элементы которой - целые числа.
Дальше R=(m(0), m(1), ..., m(k-1)) массив состоящий из k подматриц матрицы M.
1. Определить количество уникальных сумм подматриц(klasa abstrakcji (не знаю как правильно перевести) из R. 2. Определить количество сумм которые встречались больше всего раз. 3. Найти целую часть среднего арифметического всех сумм.
Ввод
n k
матрица размера n
k-количество координат для подматриц
(две координаты левого угла, две - правого)
Вывод
Пункт1 Пункт2 Пункт3

Ограничения
n [1 ; 10^4], k [1 ; 10^8], M - целые числа [-10^3,10^3]
Лимиты
По времени O(n^2+klgk), по памяти O(n^2+k)

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
;;Ввод
4 8        ;;n k
-2 -2 -3 1     ;;\
3 0 1 3        ;;| сама матрица
1 3 -3 3       ;;|
2 0 0 -2       ;;/
0 0 2 1 ;;\
2 2 2 3 ;;|
1 2 1 3 ;;|Координаты для подматриц
3 2 3 3 ;;|
3 0 3 3 ;;|
0 1 2 1 ;;|
3 3 3 3 ;;|
1 3 1 3 ;;/
;;Вывод:
5 3 0

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include <iostream>
#include <map>
#define gc getchar_unlocked
#define pc putchar_unlocked
 
using namespace std;
 
void scan_integer(int* o){
    register int c = gc();
    int x = 0;
    int neg = 0;
    for( ; ((c<48 || c>57) && c != '-'); c = gc() );
    if( c == '-' ) {
        neg = 1;
        c = gc();
    }
    for( ;c>47 && c<58; c = gc() ) {
        x = (x << 1) + (x << 3) + c - 48;
    }
    if( neg )
        x = -x;
    *o = x;
}
 
void lprint(long long int a){
    if(a == 0){
        pc('0');
    }else{
        int i=0;
    bool is_neg = false;
    if (a < 0)
    {
        is_neg = true;
        a *= -1;
    }
    char S[20];
    while(a>0){
        S[i++]=a%10+'0';
        a=a/10;
    }
    if (is_neg) S[i++] = '-';
    i--;
    while(i>=0)
    pc(S[i--]);
    } 
}
 
 
int main() {
    int size, subs_amount;
    map<long long int, long long int> my_map;
    scan_integer(&size);
    scan_integer(&subs_amount);
    
    long long int **my_matrix = new long long int*[size];
    for(int i=0;i<size;i++)
        my_matrix[i] = new long long int [size];
    
    
    for(int i = 0; i < size; i++){
        for(int j = 0; j < size; j++){
            int tmp; scan_integer(&tmp);
            if(i==0 && j==0)
                my_matrix[i][j] = tmp;
            else if(i==0 && j!= 0)
                my_matrix[i][j]  = my_matrix[i][j-1] + tmp;
            else if(i != 0 && j == 0)
                my_matrix[i][j] = my_matrix[i-1][j] + tmp;
            else
                my_matrix[i][j] = my_matrix[i][j-1] + my_matrix[i-1][j] - my_matrix[i-1][j-1] + tmp;
        }
    }
    
    
    long long int temp_sum;
    long long int sum = 0;
    long long int max = 1;
    long long int tmp = 0;
    long long int cnt = 0;
    long long int abstr= 0;
    
    
    for(int i = 0; i < subs_amount; i++){
        int a, b, c, d;
        scan_integer(&a);
        scan_integer(&b);
        scan_integer(&c);
        scan_integer(&d);
        
        temp_sum = my_matrix[c][d];
        
        if(a > 0)
            temp_sum = temp_sum - my_matrix[a-1][d];
        if(b > 0)
            temp_sum = temp_sum - my_matrix[c][b-1];
        if(a > 0 && b > 0)
            temp_sum = temp_sum + my_matrix[a-1][b-1];
            
        
        if(my_map.find(temp_sum) == my_map.end()){
            abstr++;
            my_map.insert(pair<long long int, long long int>(temp_sum, 1));
        }else{
            tmp = my_map.at(temp_sum) + 1;
            my_map.at(temp_sum) = tmp;
            if(tmp > max)
                max = tmp;
        }   
        sum += temp_sum;
    }
    
    for(map<long long int, long long int>::const_iterator it = my_map.begin(); it != my_map.end(); it++){
        if(it->second == max)
            cnt++;
    }
    lprint(abstr); pc(' ');
    lprint(cnt); pc(' ');
    lprint(sum/subs_amount);
    
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.01.2016, 16:47     Оптимизировать и ускорить программу
Посмотрите здесь:

Вывести все правильные скобочные выражения (оптимизировать алгоритм, ускорить работу кода) - C++
есть код, нужно cout и cin перевести на printf и scanf дополнительных библиотек не подключать! проблема в том что при вводе 14 работает...

Как ускорить готовую программу? - C++
Доброго времени суток уважаемые форумчане. Я решил задачу ,но при сдаче исходного кода мне пишет ,что долго выполняется программа....

Как ускорить программу за счет большей загруженности процессора? - C++
Имеется программа приведенная ниже.При большой разнице х начального и конечного и малом шаге изменения(например 1 и 9000000 с шагом 0.01)...

Нужно оптимизировать программу сложность с циклами и условными операторами - C++
Здравствуйте. Недели 2 пытаюсь кодить на с++, что-то получается, что-то не очень. Прошу отвечать только по существу. За указания на...

Резать прямоугольник, пока от него не останутся только квадраты. Посчитать их количество. (Оптимизировать программу) - C++
Есть прямоугольник A x B. Нужно отрезать от него как можно больший квадрат и отбросить его (ставя счетчик в +1). Оставшийся прямоугольник...

Ускорить обход дерева - C++
Во входном файле ancestor.in в первой строке содержится количество узлов дерева, во второй строке массив чисел i-ое из которых определяет...

Нужно ускорить код - C++
Мне нужно написать программу, для преобразования коэффициентов системы и столбца свободных членов к виду, необходимому для импорта в...

Как ускорить работу? - C++
Прога ещё не доработана, сейчас интересует именно графический режим, когда нажимается клавиша 1-4 один из 4-х квадратов должен...

Как ускорить цикл? - C++
Вот фрагмент кода: int main() { for (;;) du(); system(&quot;pause&quot;); return 0; }

Ускорить работу программы - C++
Лексикографический порядок чисел (Время: 1 сек. Память: 16 Мб Сложность: 31%) Натуральные числа от 1 до N упорядочены...

Как ускорить пирамидальную сортировку? - C++
Второй цикл for в пирамидальной сортировке можно было бы сократить, добавив условие завершения i &gt; 3. Следует ли добавить после этого цикл,...

Ускорить проверку числа на простоту - C++
Задача заключается в том ,что нужно представить какое-либо число в виде произведения простых чисел (например , вводим 30,выводим...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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