前段时间我在codereview.stackexchange中询问我的一个问题。我没有得到足够的答案,很多人告诉我在这里发一个问题只是为了得到更多答案和解决方案。我的问题是接下来的。
给出动态数组,我们想从a传递数组元素 文件。文件N中的第一个数字给出了数组长度。他们 遵循N个数字,即数组的实际元素。
三兄弟一时间在他们父亲的店里工作。 >商店运作良好,每天都能产生利润 三兄弟可以提供。兄弟们同意他们会分裂 三个连续部分的总时间,不一定相等 持续时间,并且每个人都将在商店中工作 这些部分代表他收集相应的利润。但 他们想公平地达成协议,以便从另外三个人那里收到 从别人那里获利。具体而言,他们希望尽量减少利润 这三个人中最受青睐的人会收到。
现在我创建了一个O(n ^ 2)复杂度的解决方案,但我想知道是否有人有任何其他想法来解决线性复杂性问题。
让我们假设我们有以下输入:
1 1 8 1 1 3 4 9 5 2
输出为15
。
A=1+1+8+1+1+3
,B=4+9=13
,C=5+2=7
Remenber我想要线性复杂性。如果有人认为这只是一件要完成的功课而且我很无聊,那么他就没有地方了。我只是想知道是否有人知道如何解决 C 中的问题。
我的尝试如下:
#include <stdio.h>
#include <limits.h>
#define max(A,B,C) A > (B > C ? B : C) ? A : (B > C ? B : C)
#define N 10
int main()
{
int e[N] = {1, 1, 8, 1, 1, 3, 4, 9, 5, 2 };
int i=0;
int j = N-1;
int A = e[i];
int C = e[j];
int B = 0;
int x, AL, CR, BL, BR, m, mp = INT_MAX, L, R;
for(x = i+1 ; x < j; x++) B+=e[x];
m = max(A,B,C);
printf("A=%d B=%d C=%d\n", A, B, C);
while(m < mp)
{
AL = A+e[i+1];
CR = C+e[j-1];
BL = B-e[i+1];
BR = B-e[j-1];
L = max(AL,BL,C);
R = max(A,BR,CR);
if(L<R)
{
A=AL;
B=BL;
i++;
}
else
{
C=CR;
B=BR;
j--;
}
mp = m;
m = max(A,B,C);
printf("A=%d B=%d C=%d MAX=%d\n", A, B, C, m);
}
printf("%d", mp);
return 0;
}
我不希望有人以上述代码为基础,因为它会在90%的大多数输入中提供错误的输出。