#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