#include <iostream> #include <cstring> #include <cmath> #include <cstdio> using namespace std; int d[105]; int e[105]; int x = 0, y = 0; int min1(int *a, int n){ int w1 = 0, w2 = 1; if(a[w1] > a[w2]){ //让a[w1] < a[w2]并保证是数组中最小的两个 int temp = w1; w1 = w2; w2 =temp; } for(int i = 2; i < n; i++){ // if(a[i] < a[w1]){ // w2 = w1; // w1 = i; // } if(a[i] < a[w1]){ w2 = w1; w1 = i; } else if(a[i] < a[w2]){ w2 = i; } } x = w1; y = w2; } int max1(int *a, int n){ int w1 = 0, w2 = 1; if(a[w1] < a[w2]){ int temp = w1; w1 = w2; w2 =temp; } for(int i = 2; i < n; i++){ // if(a[i] > a[w1]){ // w2 = w1; // w1 = i; //有漏洞a[i]可能介于a[w1] a[w2]之间; // } if(a[i] > a[w1]){ w2 = w1; w1 = i; } else if(a[i] > a[w2]){ w2 = i; } } x = w1; y = w2; } int getmax(int *a, int n){ while(n > 2){ min1(a, n); a[x] = a[x] * a[y] + 1; a[y] = a[n - 1]; n--; } return a[0] * a[1] + 1; } int getmin(int *a, int n){ while(n > 2){ max1(a, n); a[x] = a[x] * a[y] + 1; a[y] = a[n - 1]; n--; // cout << "x " << x << " y: " << y << " a[x]: " << a[x] << endl; } return a[0] * a[1] + 1; } int main(){ int n; cin >> n; for(int i = 0; i < n; i++){ cin >> d[i]; e[i] = d[i]; } int max = 0, min = 0; max = getmax(d, n); min = getmin(e, n); // cout << max << " " << min << endl; cout << abs(max - min); return 0; }
极差 (15分)
C时间限制:3000 毫秒 | C内存限制:3000 Kb
题目内容:
在黑板上写了N个正整数组成的一个数列,进行如下操作:每次擦去其中的两个数a和b,
然后在数列中加入一个数a*b+1,如此下去直至黑板上剩下一个数,在所有按这种操作方式
最后得到的数中,最大的为max,最小的为min,则该数列的极差定义为M=max-min.请你编程,
对于给定的数列,计算极差.
输入描述
输入包含多个测试集.每个测试集的第一行N表示正整数序列长度(0<=N<=50000),随后第二行是N个正整数.当N为0时结束.
输出描述
每个结果一行.
输入样例
3
3 5 7
输出样例
4