美文网首页
Four Integers

Four Integers

作者: 酒桶九筒 | 来源:发表于2017-07-30 10:38 被阅读0次

    Given four integers, make F(S) = abs(S[0]-S[1])+abs(S[1]-S[2])+abs(S[2]-S[3]) to be largest.

    解法:

    void foobar(vector<int> vec)
    {
        assert (vec.size() == 4);
    
        sort(vec.begin(), vec.end());
        // 2 4 1 3 or 3 1 4 2
        vector<int> tmp(4);
        tmp[0] = vec[1];
        tmp[1] = vec[3];
        tmp[2] = vec[0];
        tmp[3] = vec[2];
        cout << "order: ";
        for (int i = 0; i < tmp.size(); ++i)
            cout << tmp[i] << ", "; // don't care about the last comma
        cout << endl;
        cout << "result: " << fabs(tmp[0] - tmp[1]) + fabs(tmp[1] - tmp[2]) + fabs(tmp[2] - tmp[3]) << endl;
    }
    

    这个本质上来说是一个数学解法,当排序后的数组,2412和3142两种方式排列能使公式值最大。

    证明:
    假设排序后的数组为 a[0], a[1], a[2], a[3],令
    x = abs(a[1] - a[0])
    y = abs(a[2] - a[1])
    z = abs(a[3] - a[2])
    题目上本质是上两两求差值,求三个差值最大时的四个数的排列情况。
    当四个数不需要全部被使用时,F(S) 最大为 3 * (a[3] - a[0]),即3 * (x + y + z),基于题设,现在需要将公式 3 * (x[3] - a[0]) 中的一个a[0],一个 a[3] 替换成 a[1],a[2]。替换后最理想的情况是,a[3] 换成 a[2],a[0]换成 a[1],使 F(S)最大,为2x + 3y + 2z。其他情况都小于此值,与 x y z 值大小无关。

    相关文章

      网友评论

          本文标题:Four Integers

          本文链接:https://www.haomeiwen.com/subject/zbuhlxtx.html