すうれつきょくさもんだい


黒板にN個の正の整数からなる数列を書いて、その中の2個の数aとbを消去するたびに、数列に1個の数aを加える.×b+1、このまま黒板に1つの数が残るまで、このような操作で最後に得られたすべての数のうち、最大はmax、最小はminであり、この数列の極差はM=max-minと定義される.
プログラミングしてください.与えられた数列に対して、計算が極めて悪いです.
入力
複数のテストセットを含むように入力します.各試験セットの最初の数Nは、正の整数シーケンス長(0<=N<=50000)を表し、次いで、N個の正の整数である.Nが0の場合は入力が終了します.
しゅつりょく
結果ごとに1行
入力サンプル
3
1
2
3
0

出力サンプル
2

水の問題は直接コードを貼ります:
#define  _CRT_SECURE_NO_WARNINGS
#include
#include
#include
int A[5001], B[5001];
int cmp(const void *a, const void *b)
{
	return *(int *)a - *(int *)b;
}
int ReturnMin(int *Arr, int n)
{
	int a, b;
	while (n > 2)
	{
		qsort(Arr, n, sizeof(Arr[0]), cmp);
		a = Arr[n - 1];
		b = Arr[n - 2];
		Arr[n - 2] = a * b + 1;
		Arr[n - 1] = 0;
		n--;
	}
	return Arr[0] * Arr[1] + 1;
}
int ReturnMax(int *Arr, int n)
{
	int a, b, j = 0;
	while (j < n - 2)
	{
		qsort(Arr, n, sizeof(Arr[0]), cmp);
		a = Arr[j];
		b = Arr[j + 1];
		Arr[j + 1] = a * b + 1;
		Arr[j] = 0;
		j++;
	}
	return Arr[n - 2] * Arr[n - 1] + 1;
}
int main()
{
	memset(A, 0, sizeof(A));
	memset(B, 0, sizeof(B));
	int i, n;
	while (scanf("%d", &n) != EOF && n != 0)
	{
		for (i = 0; i