3

variable の値を上限として使用して、配列内の最も近い上限 (同等の値が見つからない場合)のインデックスを取得し、 array 内の同じインデックスで値を見つけようとしています。sizesumvalue

例: の値sumが 270 の場合、プログラムは のインデックス 6 にある値 280 を見つけ、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;
}
4

4 に答える 4

1

上限のインデックスを取得するには、次の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;
于 2014-07-23T09:15:51.670 に答える
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合計に関して分割する必要があることに注意してください。あなたの例のように並べ替えられた配列は、この基準を満たしています。

于 2014-07-23T09:16:38.283 に答える
0

これで上限のインデックスを取得する方が良いと思います:

upper_bound(size, size+27, sum) - size

上限の値を取得します。

int index = upper_bound(size, size+27, sum) - size;
cout << size[index] << endl;

以下のコードを使用してパフォーマンスをテストしました。for ループの下の各 1 行コードは、上限があるインデックスを示します。

#include <bits/stdc++.h>
using namespace std;

int main(){
    unsigned char Array[8] = {5, 10, 15, 20, 25, 30, 35, 40};
    unsigned char* it = upper_bound(Array, Array+8, 23);
    for(int i = 0 ;i < 100000000; ++i)//0.46s
        distance(Array, it);
    for(int i = 0 ;i < 100000000; ++i)//0.21s
        it - begin(Array);
    for(int i = 0 ;i < 100000000; ++i)//0.19s
        it - Array;
}

私のテストでは、最後のものが最速です。

于 2019-10-07T01:28:02.090 に答える