在黑板上写了N个正整数组成的一个数列,进行如下操作: 每次擦去其中的两个数a和b,然后在数列中加入一个数a×b+1,如此下去直至黑板上 剩下一个数,在所有按这种操作方式最后得到的数中,最大的为max,最小的为min, 则该数列的极差定义为M=max-min。
请你编程,对于给定的数列,计算极差。
输入
输入包含多个测试集。每个测试集的第一个数N表示 正整数序列长度(0<=N<=50000),随后是N个正整数。N为0表示输入结束。
输出每个结果一行
输入样例3 1 2 3 0
输出样例
2
水题直接贴代码:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
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<n; i++)
{
scanf("%d", &B[i]);
A[i] = B[i];
}
printf("%d\n", ReturnMax(A, n) - ReturnMin(B, n));
}
return 0;
}