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; }