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

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

30.07.2019, 08:42. Показов 7985. Ответов 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
4212 / 2671 / 655
Регистрация: 23.09.2014
Сообщений: 9,093
Записей в блоге: 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
4212 / 2671 / 655
Регистрация: 23.09.2014
Сообщений: 9,093
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru