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写道,有些数组这段代码不起作用,但我找不到它们。