Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
84 / 83 / 8
Регистрация: 31.03.2015
Сообщений: 447
1

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

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

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

Дана квадратная матрица 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.01.2016, 16:47
Ответы с готовыми решениями:

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

Ускорить программу на C++
Требуется ускорить эту программу тесты 7 6 3 4 36 2 2 1 1 2 2 2 1 2 4 ...

Ускорить программу
моя программа очень долго заносит данные из файла в мемо1 я так думаю это из-за того что...

Оптимизировать (ускорить) программу, работающую с массивами
Доброго времени суток! Я пытаюсь оптимизировать программу, но опыта хватило только сократить код,...

0
10.01.2016, 16:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.01.2016, 16:47
Помогаю со студенческими работами здесь

Как можно оптимизировать/ускорить код?
Здравствуйте, задача примерно такого типа: на экселевском листе есть данные в 3 колоннах (обозначим...

Ускорить программу
Есть программа, но выполняется медленно. Сириус не принимает. Нужно как-то оптимизировать. def...

Ускорить программу
Помогите ускорить программу, сам не могу найти program holysht; var a,b,c:integer; begin...

Как ускорить программу
Вот задача: ограничение времени на тест: 1 сек. ограничение памяти на тест: 262144 KB. ввод:...

Как ускорить программу
Вот задача: Требуется определить в заданном массиве количество элементов, равных искомому числу. ...

Как ускорить программу?
m=int(input()) for i in range(1,10**18): if (i)&lt;m and m&lt;=(i ** 2 + i)//2: a=(((i **...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru