Поиск верхней границы в массиве

Я пытаюсь получить индекс ближайшей верхней границы (если не найдено эквивалентное значение) в массиве size используя значение в переменной sum в качестве верхней границы, а затем найти значение с тем же индексом в массиве value,

Например: если значение в sum 270, моя программа должна найти значение 280, расположенное по индексу 6 в size и вывести значение в соответствующем value[6],

#include <iostream>
#include <cmath>
#include <cstring>

using namespace std;

int main()
{
double x = 0;
double y = 0;
double sum = 0;
double size[27] = {24, 28, 32, 38, 48, 240, 280, 320, 360, 380,
420, 480, 560, 600, 640, 700, 720, 800, 840,
960, 980, 1120, 1200, 1280, 1440, 1680, 1920};

double value[27] = {.0022, .0026, .0029, .0035, .0044, .0219,
.0256, .0292, .0328, .0384, .0438, .0513,
.0547, .0584, .0641,.0656, .073, .0766,
.0875, .0877, .0897, .1023, .1094, .1169,
.1313, .1531, .175};

cout << "Enter width: " << endl;
cin >> x;
cout << "Enter height: " << endl;
cin >> y;

x = ceil(x) + 3;
y = ceil(y) + 3;

sum = x * y;
}

3

Решение

Измените свой код на это —

    double x = 0;
double y = 0;
double sum = 0;
int size[27] = {24, 28, 32, 38, 48, 240, 280, 320, 360, 380,
420, 480, 560, 600, 640, 700, 720, 800, 840, 960, 980, 1120, 1200, 1280, 1440, 1680, 1920};
double value[27] = {.0022, .0026, .0029, .0035, .0044, .0219,
.0256, .0292, .0328, .0384, .0438, .0513, .0547, .0584, .0641,.0656, .073, .0766, .0875, .0877, .0897, .1023, .1094, .1169, .1313, .1531, .175};

cout << "Enter width: " << endl;
cin >> x;
cout << "Enter height: " << endl;
cin >> y;

x = ceil(x) + 3;
y = ceil(y) + 3;

sum = x * y;

for (int i=0;i<27;i++)
{
if (size[i]>=sum)
{
cout<<value[i]<<endl;
break;
}
else if(i==26)
{
cout<<"No upper Bound find\n";
}
}

Есть и другие способы решить эту проблему. Но, как вы сказали, вы новичок. Я дал простое грубое решение. 🙂

0

Другие решения

Чтобы получить индекс верхней границы, просто используйте std::upper_bound вот так (требует, чтобы диапазон был хотя бы частично отсортирован):

// Get iterator to upper bound.
auto it = std::upper_bound(std::begin(size), std::end(size), sum);

// Get index by iterator subtraction.
std::size_t index = it - std::begin(size);

Тогда используйте index например как:

std::cout << value[index] << std::endl;
0

Самый простой способ можно сделать в 2 строки:

auto size_ub = std::upper_bound(std::begin(size), std::end(size), sum);
int idx = std::distance(std::begin(size), size_ub);

cout << value[idx] << endl;

Обратите внимание, что size должен быть разделен по сумме. Сортированный массив, как в вашем примере, соответствует этому критерию.

0
По вопросам рекламы [email protected]