列表

详情


OR169. 公平划分

描述

小爱和小溪有N个数字,他们两个想公平的分配这些数字。小爱拿的数字集合为I=「i1, i2, ik」,小溪获得剩下的J,J=「j1, j2, jn-k」。但是他们衡量分配公平与否的原则与众不同:

在小爱拿到其中的K个数字的前提下,计算出他们分配偏差f(I)的最小值

输入描述

输入第一行两个数字,分别表示总的数字量N和小爱拿的数字量K。第二行有N个数字,表示每个数字的值。

输出描述

输出一个数字,表示分配偏差f(I)的最小值。

示例1

输入:

4 1
3 3 3 1

输出:

2

原站题解

C++ 解法, 执行用时: 2ms, 内存消耗: 376KB, 提交时间: 2020-10-31

#include <iostream>
#include <cmath>
using namespace std;
int L1, L2;
int getValue(int b1[], int b2[])
{
    int i, j, s(0);
    for (i = 0; i < L1; i++)
    {
        for (j = 0; j < L2; j++)
            s += abs(b1[i] - b2[j]);
    }
    return s;
}
int main()
{
    static int N, k,c;
    int i, j,m,min, smin(0);
    cin >> N >> k;
    float* a = new float[N];
    for (i = 0; i < N; i++)
        cin >> a[i];
 
    L1 = k;
    L2 = N-k;
    int* b1 = new int[L1];
    int* b2 = new int[L2];
    for (j = 0; j < k; j++)
        b1[j] = a[j];
    for (j = k; j < N; j++)
        b2[j-k] = a[j];
    smin = getValue(b1, b2);
    for (j = 0; j < k; j++)
        for (c = 0; c <N-k; c++)
        {
            m = b1[j];
            b1[j] = b2[c];
            b2[c] = m;
            min = getValue(b1, b2);
            if (min < smin)
                smin = min;
            else
            {
                b2[c] = b1[j];
                b1[j] = m;
            }
        }
    cout << smin;
}

C++ 解法, 执行用时: 2ms, 内存消耗: 376KB, 提交时间: 2020-10-31

#include <iostream>
#include <cmath>
using namespace std;
int L1, L2;
int getValue(int b1[], int b2[])
{
    int i, j, s(0);
    for (i = 0; i < L1; i++)
    {
        for (j = 0; j < L2; j++)
            s += abs(b1[i] - b2[j]);
    }
    return s;
}
int main()
{
    static int N, k,c;
    int i, j,m,min, smin(0);
    cin >> N >> k;
    float* a = new float[N];
    for (i = 0; i < N; i++)
        cin >> a[i];
 
    L1 = k;
    L2 = N-k;
    int* b1 = new int[L1];
    int* b2 = new int[L2];
    for (j = 0; j < k; j++)
        b1[j] = a[j];
    for (j = k; j < N; j++)
        b2[j-k] = a[j];
    smin = getValue(b1, b2);
    for (j = 0; j < k; j++)
        for (c = 0; c <N-k; c++)
        {
            m = b1[j];
            b1[j] = b2[c];
            b2[c] = m;
            min = getValue(b1, b2);
            if (min < smin)
                smin = min;
            else
            {
                b2[c] = b1[j];
                b1[j] = m;
            }
        }
    cout << smin;
}

上一题