------------只要够努力,人生最坏的结局不过是大器晚成!!!

                  

#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

posted on 2017-10-22 10:06  ystraw  阅读(237)  评论(0编辑  收藏  举报

不经一番切孤寒,怎得梅花扑鼻香