C 求数组中至少包含两个元素的任何切片的最小平均值

C 求数组中至少包含两个元素的任何切片的最小平均值,c,C,全部问题是: 我不明白为什么我的代码不起作用 我知道正确答案,但我找不到与我的代码相反的示例: struct partaverg { long double min; int slice; }; long long sumfun(int arr[], int N) { int sum = 0; for (int i = 0; i < N; ++i) sum += arr[i]; return sum; } int solution

全部问题是:

我不明白为什么我的代码不起作用

我知道正确答案,但我找不到与我的代码相反的示例:

struct partaverg {
    long double min;
    int slice;
};

long long sumfun(int arr[], int N) {
    int sum = 0;
    for (int i = 0; i < N; ++i)
        sum += arr[i];
    return sum;
}

int solution(int A[], int N) {
    long long sum;
    long double new_average;

    int left = 0;
    int right = N - 1;
    long double numofnum;
    long double leftaverg, rightaverg;
    sum = sumfun(A, N);
    struct partaverg result;
    new_average = result.min = sum / (long double)N;
    result.slice = 0;
    while (left + 1 < right) {
        numofnum = right - left;
        leftaverg = (sum - A[left]) / numofnum;
        rightaverg = (sum - A[right]) / numofnum;
        if (leftaverg > rightaverg) {
            sum -= A[right--];
            new_average = rightaverg;
        } else {
            sum -= A[left++];
            new_average = leftaverg;
        }
        if (result.min > new_average) {
            result.min=new_average;
            result.slice=left;
        }
    }
    return result.slice;
}
struct partaverg{
长双分;
int切片;
};
隆隆盛丰(国际机场[],国际北){
整数和=0;
对于(int i=0;irightaverg){
sum-=A[右--];
新平均值=右平均值;
}否则{
总和-=A[左++];
新平均值=左平均值;
}
如果(result.min>new_average){
结果:最小值=新的平均值;
结果:切片=左;
}
}
返回result.slice;
}

当当前切片在最左边和最右边的位置上保持相同的数字时,算法的问题就出现了。你应该删除哪个号码?左边还是右边

您当前的算法总是删除左边的数字,但这可能不正确。考虑:

int arr[4] = {1,9, 10, 1 };

// left average = (1 + 9 + 10) /3
// right average = (9 + 10 + 1) /3
左平均值和右平均值相同,因此您的代码将删除左数字并继续执行此切片:

{9, 10, 1 };
这是错误的。现在,您无法再获得正确的结果,即:

{1,9};

我不明白为什么我的代码不起作用。你能更准确地告诉我们什么不起作用吗?Codibility写道,有些数组这段代码不起作用,但我找不到它们。