Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.95/40: Рейтинг темы: голосов - 40, средняя оценка - 4.95
0 / 0 / 0
Регистрация: 15.07.2019
Сообщений: 69

Нужно оптимизировать код

30.07.2019, 08:42. Показов 7978. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Гистограмма является многоугольником, сформированным из последовательности прямоугольников, выровненных на общей базовой линии. Прямоугольники имеют равную ширину, но могут иметь различные высоты. Например, фигура слева показывает гистограмму, которая состоит из прямоугольников с высотами 2, 1, 4, 5, 1, 3, 3.
Обычно гистограммы используются для представления дискретных распределений, например, частоты символов в текстах. Отметьте, что порядок прямоугольников очень важен. Вычислите область самого большого прямоугольника в гистограмме, который также находится на общей базовой линии.

Входные данные
В первой строке входного файла записано число N (0 < N ≤ 10^6) - количество прямоугольников гистограммы. Затем следует N целых чисел h^1 h^n, где 0 ≤ h^i ≤ 10^9. Эти числа обозначают высоты прямоугольников гистограммы слева направо. Ширина каждого прямоугольника равна 1

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

Примеры
входные данные
7 2 1 4 5 1 3 3
выходные данные
8
Есть код, но не проходит 1 тест по времени (ограничение 1 сек. у меня этот тест проходит за 1.096)
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
#include <stdio.h>
 
#define MAX 1000010
 
 
 
long long h[MAX];
 
int i, n, left, right;
 
long long area, res;
 
 
 
int main(void)
 
{
 
  scanf("%d",&n);
 
  for(i = 1; i <= n; i++)
 
    scanf("%d",&h[i]);
 
 
 
  res = 0;
 
  for(i = 1; i <= n; i++)
 
  {
 
    left = right = i;
 
    while(left > 1 && h[left-1] >= h[i]) left--;
 
    while(right < n && h[right+1] >= h[i]) right++;
 
    area = (right - left + 1) * h[i];
 
    if (area > res) res = area;
 
  }
 
  printf("%lld\n",res);
 
  return 0;
 
}
Реализация за O(n2) если что
Я эту тему уже создавал, но создал не в С++ для начинающих, а просто с++ поэтому решил тут сделать, а удалить не могу
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.07.2019, 08:42
Ответы с готовыми решениями:

Нужно оптимизировать код
Вобщем код не принемает сайт, немного нагружает и по времени не проходит задание Август и Беатриса играют в игру. Август загадал...

Нужно оптимизировать код
Нужно максимально сократить код #include &lt;iostream&gt; using namespace std; int main(int argc, char** argv) { int a, i,...

Нужно оптимизировать готовый код, чтобы не было стыдно показать
Мне дали сделать задачку, чтобы проверить мои знания в ООП (я только 2 месяца назад начал изучать С++). И так, задача: Я написал...

27
Заблокирован
30.07.2019, 08:54
ссылка где проверяют?
0
0 / 0 / 0
Регистрация: 15.07.2019
Сообщений: 69
30.07.2019, 09:06  [ТС]
https://informatics.mccme.ru/m... d=113915#1
0
490 / 286 / 129
Регистрация: 30.10.2018
Сообщений: 1,309
30.07.2019, 09:11
Bluestick, в данном случае, площать самого большого прямоугольника, это у прямоугольника у которого самая большая высота, что за базовая линия?

Добавлено через 3 минуты
Цитата Сообщение от Bluestick Посмотреть сообщение
Примеры
входные данные
7 2 1 4 5 1 3 3
выходные данные
8
Почему тут 8? Разве 7*1 не будет 7?
0
0 / 0 / 0
Регистрация: 15.07.2019
Сообщений: 69
30.07.2019, 09:20  [ТС]
с чего вы взяли что 7? Прямоугольник должен быть на общей базовой черте
(в ссылке есть задача Гистограмма, а в ней рисунок как только посмотрите поймете)
0
Just Do It!
 Аватар для XLAT
4211 / 2670 / 655
Регистрация: 23.09.2014
Сообщений: 9,083
Записей в блоге: 3
30.07.2019, 09:24
Цитата Сообщение от kitsoRik Посмотреть сообщение
Почему тут 8? Разве 7*1 не будет 7?
Цитата Сообщение от Bluestick Посмотреть сообщение
В первой строке входного файла записано число N (0 < N ≤ 10^6) - количество прямоугольников гистограммы.
7 это кол-во прямоугольников.
ответ должен быть 5.

Добавлено через 2 минуты
Цитата Сообщение от Bluestick Посмотреть сообщение
в ссылке есть задача Гистограмма
Цитата Сообщение от Bluestick Посмотреть сообщение
https://informatics.mccme.ru/mod/sta...terid=113915#1
это реклама?
чтобы 2 секунды посмотреть на вашу гистограмму мне надо 20 минут потратить на регистрацию?
0
490 / 286 / 129
Регистрация: 30.10.2018
Сообщений: 1,309
30.07.2019, 09:24
Bluestick, там вход по кодовому слову

Цитата Сообщение от XLAT Посмотреть сообщение
7 это кол-во прямоугольников.
ответ должен быть 5.
тут да, незаметил, всегда же делают перевод что бы отделить, хорошо, но ответ то не совпал
0
0 / 0 / 0
Регистрация: 15.07.2019
Сообщений: 69
30.07.2019, 09:25  [ТС]
ну смотрите, 7 - это просто столб (т.к у него ширина 1, а нам нужен прямоугольник) рядом с ним стоит столб в высотой 2 и получается прямоугольник 2 на 2. Это и есть базовая черта
Попробуйте в paint нарисован примерно и тогда поймете
0
Заблокирован
30.07.2019, 09: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
int h[1000000]={7, 2, 1, 4, 5, 1, 3, 3};
void main(int argc,char **argv)
{
    int n=8;
    scanf("%d",&n);
    for(int i = 0; i < n; i++)
        scanf("%d",h+i);
    int left, right, old;
    long long area, res=0;
    for(int i = 0; i < n; i++)
    {
        left = right = i;
        int hi=h[i];
        if(i)
        {
            if(hi==h[i-1]) continue;
            if(hi<h[i-1]) left=old;
        }
        while(left && h[left-1] >= hi) left--;
        while(right < n-1 && h[right+1] >= hi) right++;
        area = (right - left + 1ll) * hi;
        if (area > res) res = area;
        old=left;
    }
    cout<<res<<endl;
0
0 / 0 / 0
Регистрация: 15.07.2019
Сообщений: 69
30.07.2019, 09:27  [ТС]
главное понимать что нам нужны именно прямоугольники, а не столбы
0
490 / 286 / 129
Регистрация: 30.10.2018
Сообщений: 1,309
30.07.2019, 09:27
Bluestick, Гистограмма

Цитата Сообщение от Bluestick Посмотреть сообщение
это просто столб (т.к у него ширина 1, а нам нужен прямоугольник)
столб не прямоугольник? У него в любом случае есть высота и ширина,

Цитата Сообщение от Bluestick Посмотреть сообщение
2 на 2
2 на 2? Так ширина же всегда 1.
0
0 / 0 / 0
Регистрация: 15.07.2019
Сообщений: 69
30.07.2019, 09:35  [ТС]
Они соединяются столбы что дают во входных прилипают друг к другу от того и получается что
Цитата Сообщение от Bluestick Посмотреть сообщение
4 5
ихняя площадь больше чем площадь 5

Добавлено через 39 секунд
ошибка компиляции
(в начале коде я добавлял #include <iostream> using namespace std; так что не из-за этого)
0
Just Do It!
 Аватар для XLAT
4211 / 2670 / 655
Регистрация: 23.09.2014
Сообщений: 9,083
Записей в блоге: 3
30.07.2019, 09:40
Цитата Сообщение от Bluestick Посмотреть сообщение
Попробуйте в paint нарисован примерно и тогда поймете


всё по инструкции:
Цитата Сообщение от Bluestick Посмотреть сообщение
ну смотрите, 7 - это просто столб (т.к у него ширина 1, а нам нужен прямоугольник) рядом с ним стоит столб в высотой 2 и получается прямоугольник 2 на 2. Это и есть базовая черта

прямоугольник 2 на 2 является чертой?
0
0 / 0 / 0
Регистрация: 15.07.2019
Сообщений: 69
30.07.2019, 09:41  [ТС]
именно так
0
Заблокирован
30.07.2019, 09:43
Цитата Сообщение от Bluestick Посмотреть сообщение
ошибка компиляции
main закрыт }?
0
0 / 0 / 0
Регистрация: 15.07.2019
Сообщений: 69
30.07.2019, 10:09  [ТС]
Цитата Сообщение от Pvt Посмотреть сообщение
void main(int argc,char **argv)
про это? Если закрою хуже станет
0
Заблокирован
30.07.2019, 10:16
..... стр.26 = }
0
0 / 0 / 0
Регистрация: 15.07.2019
Сообщений: 69
30.07.2019, 12:13  [ТС]
что значит стр 26?
0
490 / 286 / 129
Регистрация: 30.10.2018
Сообщений: 1,309
30.07.2019, 12:41
Цитата Сообщение от Bluestick Посмотреть сообщение
что значит стр 26?
строка
0
0 / 0 / 0
Регистрация: 15.07.2019
Сообщений: 69
30.07.2019, 13:38  [ТС]
005215.cpp:4:32: error: '::main' must return 'int'
void main(int argc, char **argv)
видимо ошибка на уровне входных данных
(я не могу запустить код, ибо с++ недавно сломался и не хочет запускать коды)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.07.2019, 13:38
Помогаю со студенческими работами здесь

Нужно оптимизировать
Есть задание, есть готовый код. Но он не проходит скоростной режим, нужно оптимизировать, помогите плз) #include...

Змейка. Нужно оптимизировать
Написал игру &quot;Змейка&quot;,вернее скоро напишу. Вся проблема в том,что я не могу ее нормально оптимизировать. #include &quot;pch.h&quot; ...

Нужно оптимизировать функцию
Немножко не шарю но она должна сортировать пузырьком: #include &lt;iostream&gt; #include &lt;time.h&gt; using namespace std; int...

Оптимизировать код
Для решения задачи : &quot;Note: Write a solution that only iterates over the string once and uses O(1) additional memory, since this is what...

Оптимизировать код
Для решения задачи : &quot;Given an array a that contains only numbers in the range from 1 to a.length, find the first duplicate number for...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru