现有一个数组A,对于A中的每个元素A[i],都可以进行+K或者-K的操作(每个元素仅能选择加或减一次)。 在这个操作后,我们将得到许多不同版本的数组B。 请找出所有可能的B数组中,数组中最大值与最小值里最小的差值。

/*输入

每组测试数据的第一行为一个整数K(0<=K<=10000),第二行为数组A(1 <= A.length <= 10000,0 <= A[i] <= 10000)

 输出

对每组测试数据,在单独的一行里输出最小的差值。

 样例输入

3

1 3 6

样例输出

3*/

#include "stdafx.h"

#include <iostream>

#include <vector>

#include <numeric>

#include <limits>

using namespace std; 

int smallestRange(int k, int *A, int len)

{

    int i = len;

    int add[10000], jian[10000];

    for (int j = 0; j<i; j++)

    {

        add[j] = A[j] + k;

        jian[j] = A[j] - k;

    }

    int min = 0;

    for (int j = 0; j<i - 1; j++)

    {

        for (int q = j + 1; q<i; q++)

        {

            int ta1 = add[j] - add[q];

            int ta2 = -1 * ta1;

            int tj1 = jian[j] - jian[q];

            int tj2 = -1 * tj1;

            if (ta1<ta2&&ta1<tj1&&ta1<tj2)

            {

                min = ta1;

            }

            else{

                if (ta2<ta1&&ta2<tj1&&ta2<tj2)

                {

                    min = ta2;

                }

                else{

                    if (tj1<ta1&&tj1<ta2&&tj1<tj2)

                    {

                        min = tj1;

                    }

                    else{

                        min = tj2;

                    }

                }

            }

        }

    }

    return min;

}

int _tmain(int argc, _TCHAR* argv[])

{

    int k;

    cout << "K" << endl;

    cin >> k;

    int A[10000];

    int in = 0, i = 0;

    cout << "A" << endl;

    while (in >= 0)

    {

        cin >> in;

        A[i] = in;

        i++;

    }

    int len = i-1;

   int res;

    res = smallestRange(k, A, len);

    cout << res << endl;

    return 0;

}

 

 

猜你喜欢

转载自www.cnblogs.com/yuanch2019/p/11537274.html