数列极差问题

来源:互联网 发布:神州鹰软件 编辑:程序博客网 时间:2024/06/08 07:27

  在黑板上写了N个正整数组成的一个数列,进行如下操作: 每次擦去其中的两个数a和b,然后在数列中加入一个数a×b+1,如此下去直至黑板上 剩下一个数,在所有按这种操作方式最后得到的数中,最大的为max,最小的为min, 则该数列的极差定义为M=max-min。


    请你编程,对于给定的数列,计算极差。


输入

    输入包含多个测试集。每个测试集的第一个数N表示 正整数序列长度(0<=N<=50000),随后是N个正整数。N为0表示输入结束。

输出

    每个结果一行

输入样例
31230

输出样例

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;}

0 0
原创粉丝点击