Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
 Аватар для GoldenId
142 / 143 / 64
Регистрация: 11.11.2010
Сообщений: 877
Записей в блоге: 10

Условие ложно, но в условный оператор заходит

06.02.2020, 14:00. Показов 2456. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
1284-B.cpp:
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
//#define CF
#include <cstddef>
#ifdef CF
#include <iostream>
#else
#include <fstream>
#endif
#include <vector>
#include <algorithm>
 
using namespace std;
 
int main()
{
#ifdef CF
    std::istream& is = std::cin;
    std::ostream& os = std::cout;
#else
    std::ifstream is("in.txt");
    std::ofstream os("out.txt");
#endif
 
    int n;
    int i, j;
 
    is >> n;
 
    vector<vector<int>> ss(n);
 
    vector<int> mins(n), maxs(n);
    vector<bool> raises(n);
    int raises_amt, pair_raises_amt;
    raises_amt = pair_raises_amt = 0;
 
    int g_min = 1, g_max = 0;
 
    for (i = 0; i < n; i++)
    {
        int l;
        is >> l;
        ss[i].resize(l);
        is >> ss[i][0];
        mins[i] = maxs[i] = ss[i][0];
 
        for (j = 1; j < l; j++)
        {
            is >> ss[i][j];
            if (ss[i][j] < mins[i])
                mins[i] = ss[i][j];
            if (ss[i][j] > maxs[i])
                maxs[i] = ss[i][j];
            if (ss[i][j - 1] < ss[i][j])
                raises[i] = true;
        }
 
        g_max = std::max(g_max, maxs[i]);
    }
 
    vector<int> min_amts(g_max + 1), max_amts(g_max + 1);
 
    for (i = 0; i < n; i++)
    {
        min_amts[mins[i]]++;
        max_amts[maxs[i]]++;
    }
 
    vector<int> maxs_more(g_max);
 
    maxs_more[g_max - 1] = max_amts[g_max];
    for (i = g_max - 2; i >= g_min; i--)
    {
        maxs_more[i] = maxs_more[i + 1] + max_amts[i + 1];
    }
 
    vector<vector<int>> min_to_idx_map(g_max + 1);
    vector<vector<int>> max_to_idx_map(g_max + 1);
    for (i = 0; i < n; i++)
    {
        min_to_idx_map[mins[i]].push_back(i);
        max_to_idx_map[maxs[i]].push_back(i);
    }
 
    vector<int> str_w_raise_and_max_lesster_amts(g_max + 1);
    for (i = g_min; i <= g_max; i++)
    {
        for (j = 0; j < max_to_idx_map[i].size(); j++)
            if (raises[max_to_idx_map[i][j]] && maxs[max_to_idx_map[i][j]] < i)
                str_w_raise_and_max_lesster_amts[i]++;
    }
 
 
    for (i = g_min; i < g_max; i++)
    {
        for (j = 0; j < min_to_idx_map[i].size(); j++)
        {
            if (raises[min_to_idx_map[i][j]])
                pair_raises_amt += n;
            else
                pair_raises_amt += (__int64)min_amts[i] * maxs_more[i];
        }
    }
 
    os << pair_raises_amt;
}
Входные данные, содержимое in.txt:
Code
1
2
3
4
3
4 2 0 2 0
6 9 9 8 8 7 7
1 6
Строки 87, 88 при первом попадании туда:


Проект: Hello 2020.zip

Microsoft Visual Studio Community 2019
Версия 16.4.4
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.02.2020, 14:00
Ответы с готовыми решениями:

Условный оператор: поменять значения переменных так, чтобы выполнилось условие
Даны вещественные x1, x2, x3, x4 . Поменять значения переменных так, чтобы \chi 1 \geq \chi 2; \chi 3 \geq \chi 4.

Почему условный оператор даже, если условие неверно, выдает истину?
void change() { int tmp = 0; do { tmp = 0; cout &lt;&lt; &quot;Napishite Nazvanie, Regisera filma&quot; &lt;&lt; endl; char chName;...

Условные операторы. Будет ли проверено условие condition2, если первое условие condition1 ложно?
Подскажите знающие люди новичку в С++ есть условный оператор: 1) if( condition1 &amp;&amp; condition2 ) будет ли проверено условие...

15
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
06.02.2020, 14:41
GoldenId, было бы неплохо увидеть условие задачи и комментарии в коде.
Хотя бы укажите, для чего нужен каждый используемый вектор. Кроме, разве что, исходной матрицы. Тут все понятно и так.
А то, в Ваших векторах легко запутаться.
1
 Аватар для GoldenId
142 / 143 / 64
Регистрация: 11.11.2010
Сообщений: 877
Записей в блоге: 10
06.02.2020, 15:27  [ТС]
liv, ну... вообще, насколько понимаю, Вам не следует нагружаться тем, чтобы разбираться в логике задачи. Меня не устраивает именно то, что неправильно срабатывает условный оператор: условие == false, но в условный оператор заходит, но если Вы спрашиваете, отвечу.

Условие

ss - входные строки
mins[i] - минимум в строке ss[i]
maxs[i] - максимум в строке ss[i]
raises[i] - есть ли в строке ss[i] "восход" (см. условие)
pair_raises_amt - количество конкатенированных пар (sx, sy), в которых есть "восход"
min_amts[i] - количество строк с минимумом == i
max_amts - количество строк с максимумом == i
maxs_more[i] - количество строк с максимумом > i
min_to_idx_map[i] - индексы строк с минимумом == i
max_to_idx_map[i] - индексы строк с максимумом == i
str_w_raise_and_max_lesster_amts[i] - количество строк с "восходом" и максимумом < i

Ещё раз повторю, что скорее всего этот "лес" для решения моего затруднения не нужен. Скорее всего там что-то вроде неочищенного проекта или какой-то другой технический затык (но именно очистку проекта).

Добавлено через 17 минут
Цитата Сообщение от GoldenId Посмотреть сообщение
(но именно очистку проекта).
но именно очистку проекта я делал
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
06.02.2020, 16:16
Лучший ответ Сообщение было отмечено GoldenId как решение

Решение

Цитата Сообщение от GoldenId Посмотреть сообщение
Условие ложно, но в условный оператор заходит
бывают глюки, сделай так:
C++
1
2
3
4
5
for (j = 0; j < max_to_idx_map[i].size(); j++)
{ // фигурные скобки поставь
    if (raises[max_to_idx_map[i][j]] && maxs[max_to_idx_map[i][j]] < i)
        str_w_raise_and_max_lesster_amts[i]++;
}
1
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
06.02.2020, 17:20
GoldenId, хм... А у меня в условный оператор не заходит... VS2017
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
06.02.2020, 17:41
Цитата Сообщение от liv Посмотреть сообщение
хм... А у меня в условный оператор не заходит... VS2017
Я однажды столкнулся с таким глюком, долго сидел в отладчике и не мог понять что происходит. Плюнул, расставил везде где можно фигурные скобки и заработало. В итоге VS отучил меня писать вложенные циклы в таком стиле:
C++
1
2
3
4
for(...)
    for(...)
        if(...)
            do_something();
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
06.02.2020, 18:06
zayats80888, было бы прелюбопытно посмотреть под отладчиком (вплодь до ассемблерного кода),
чтобы понять, что происходит. Может, как-то нарушается порядок выполнения команд...
А на счет скобок, я их пишу всегда, кроме случая, когда телом оператора является ровно одна команда.
Так намного нагляднее...

Добавлено через 1 минуту
Ждем ТС, что скажет на скобки

Добавлено через 8 минут
GoldenId, ну так, что, скобочки таки помогли?
0
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,282
06.02.2020, 19:06
C++ (Qt)
1
if ((raises[max_to_idx_map[i][j]] != 0) && (maxs[max_to_idx_map[i][j]] < i))
Вот так задумывалось?
0
фрилансер
 Аватар для Алексей1153
6465 / 5678 / 1131
Регистрация: 11.10.2019
Сообщений: 15,118
07.02.2020, 00:06
вообще, что за странная экономия скобок. Не бумагу же тратим. Выглядеть должно по-человечьи, тогда и работать так же будет

Добавлено через 2 минуты
C++
1
2
if (raises[max_to_idx_map[i][j]] && maxs[max_to_idx_map[i][j]] < i)
                str_w_raise_and_max_lesster_amts[i]++;
он (указатель команд) не то, чтобы не заходит. Он очень даже заходит. Но без скобочек - это одна строка, хоть и разделённая переносом строки. И отладчик за один шаг выполняет всю строку, поэтому и кажется, что не заходит



C++
1
2
3
4
5
6
const auto& чегототам=max_to_idx_map[i][j];
 
if (raises[чегототам] && maxs[чегототам] < i)
{
      str_w_raise_and_max_lesster_amts[i]++;
}
0
 Аватар для GoldenId
142 / 143 / 64
Регистрация: 11.11.2010
Сообщений: 877
Записей в блоге: 10
07.02.2020, 02:22  [ТС]
liv, да, скобки помогли.
0
08.02.2020, 08:28  [ТС]

Не по теме:

Цитата Сообщение от Алексей1153 Посмотреть сообщение
вообще, что за странная экономия скобок. Не бумагу же тратим.
Если у меня не самое высокое разрешение экрана?

Не по теме:

Цитата Сообщение от Алексей1153 Посмотреть сообщение
Выглядеть должно по-человечьи, тогда и работать так же будет
Это так написано в стандарте?



Цитата Сообщение от Алексей1153 Посмотреть сообщение
Но без скобочек - это одна строка, хоть и разделённая переносом строки. И отладчик за один шаг выполняет всю строку, поэтому и кажется, что не заходит
Нет. У меня отрабатывал как две строки. Было две точки останова и две остановки - на каждой строке отдельно.

0
фрилансер
 Аватар для Алексей1153
6465 / 5678 / 1131
Регистрация: 11.10.2019
Сообщений: 15,118
08.02.2020, 08:37
GoldenId, ну, компилятору то без разницы на экран. Купи новый монитор. Глаза тоже нужно беречь
0
 Аватар для GoldenId
142 / 143 / 64
Регистрация: 11.11.2010
Сообщений: 877
Записей в блоге: 10
08.02.2020, 08:40  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
Купи новый монитор.
Дай денег.

Не по теме:

Цитата Сообщение от Алексей1153 Посмотреть сообщение
Глаза тоже нужно беречь
Ты очень заботлив :)

0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
09.02.2020, 20:23
Цитата Сообщение от GoldenId Посмотреть сообщение
vector<bool> raises(n);
Ой ...

Добавлено через 51 секунду
Цитата Сообщение от GoldenId Посмотреть сообщение
ss - входные строки
WTF? input_strings?

Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  for (i = 0; i < n; i++)
    {
        int l;
        is >> l;
        ss[i].resize(l);
        is >> ss[i][0];
        mins[i] = maxs[i] = ss[i][0];
 
        for (j = 1; j < l; j++)
        {
            is >> ss[i][j];
            if (ss[i][j] < mins[i])
                mins[i] = ss[i][j];
            if (ss[i][j] > maxs[i])
                maxs[i] = ss[i][j];
            if (ss[i][j - 1] < ss[i][j])
                raises[i] = true;
        }
 
        g_max = std::max(g_max, maxs[i]);
    }
Что то мне подсказывает что тут можно было бы воткнуть std::minmax_element или что-то типа того...
1
 Аватар для GoldenId
142 / 143 / 64
Регистрация: 11.11.2010
Сообщений: 877
Записей в блоге: 10
10.02.2020, 09:05  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
WTF? input_strings?
Условие читали?

Цитата Сообщение от Avazart Посмотреть сообщение
Что то мне подсказывает что тут можно было бы воткнуть std::minmax_element или что-то типа того...
Благодарю. Вы достаточно хорошо разбираетесь в STL?
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.02.2020, 13:17
Цитата Сообщение от GoldenId Посмотреть сообщение
Условие читали?
В условии было написано откровенно гавнокодить и давать переменным невразумительные имена?

Добавлено через 1 минуту
Цитата Сообщение от GoldenId Посмотреть сообщение
Благодарю. Вы достаточно хорошо разбираетесь в STL?
Иногда достаточно знать что есть STL ...
Достаточно что бы загуглить и не писать велосипеды и простыню спагетти-кода
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.02.2020, 13:17
Помогаю со студенческими работами здесь

Если условие if ложно , то программа зависает.
Если условие выполняется все работает. Если же нет , то все зависает и 2 условие даже не проверяется... что я упустил? Подскажите...

При каких условиях else может не выполняться, если условие в if ложно
А при каких условиях оператор условия else может не выполнятся, если условие в операторе if не верно У меня есть условие. И оно почему то...

Условный оператор, оператор ввода/вывода; плоскость и принадлежность точки
Здравствуйте. В С++ я абсолютный новичок, поэтому с первым же заданием возникли определённые трудности. Будьте добры, помогите решить. Буду...

Условный оператор: Вычислить заданное целочисленное выражение, используя условный оператор IF
Вычислить заданное целочисленное выражение для данных a,b в формате INTEGER, используя условный оператор IF. ...

Используя условный оператор if и оператор альтернативного выбора otherwise найдите значение функции
Помогите пожалуйста написать алгоритм с проверкой условия. Ни как не пойму, там и в зависит от х, и н зависит от х. Файл прилагается. ...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru