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

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

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

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

10.01.2016, 16:47. Просмотров 167. Ответов 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.01.2016, 16:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Оптимизировать и ускорить программу (C++):

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

Как ускорить данную программу - C++
И опять магические квадраты...Пытаюсь вычислить все магические квадраты 4-ого порядка, но программа работает слишком медленно...Странно, но...

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

Ускорить программу сортировки списка в порядке возрастания - C++
Здраствуйте!Написал код программы.Тесты не проходит из-за превышение времени работы. Суть такова: Вводится число n-количество троек...

Ускорить программу ответа на запросы различных типов - C++
Дан одномерный целочисленный массив A длины N. Пусть нумерация элементов в массиве начинается с 1 и M= 10^9+ 7.Ваша задача –ответить на...

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

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.01.2016, 16:47
Привет! Вот еще темы с ответами:

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

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

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

Необходимо ускорить выполнение - C++
Хеллоу эврибади. Проблема такая, имеется 2 вложенных цикла: for(int i=0;i&lt;n;i++){ for(int j=i;j&lt;n;j++){ ...


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

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

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