题目描述
n个整数排成的数列,进行如下操作:每次擦去其中两个数a和b,然后在数列中加入一个数 a x b + 1
,如此下去直到黑板只剩一个数,在所有按这种操作方式最后得到的数中,最大的记作 max
,最小的为 min
,则数列的极差定义为: m = max - min
分析:
以三个数为例:a>b>c,这三个数计算有以下几种结果:
- ( a x b + 1 ) x c + 1 = a x b x c + c +1
- ( a x c + 1 ) x b + 1 = a x b x c + b +1
- ( c x b + 1 ) x a + 1 = a x b x c + a +1
由此可知:先运算小数据得到是大数据,先运算大数据得到的是小数据
我们如是设计代码:用vector存储数据,计算最大数的时候,我们每次娶两个最小的数字计算再将结果 (min1*min2 + 1)
放入vector容器中,计算最小数字的时候与之相反即可。
接下来上代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| #include<iostream> #include<vector> using namespace std;
int getTheMin(vector<int> &numbers) { vector <int>::const_iterator i, j = numbers.begin(); int min = *j; for (i = numbers.begin(); i != numbers.end(); ++i) { if(*i < *j) { j = i; min = *i; } } numbers.erase(j); return min; }
int getTheMax(vector<int> &numbers) { vector <int>::const_iterator i, j = numbers.begin(); int max = *j; for (i = numbers.begin(); i != numbers.end(); ++i) { if(*i > *j) { j = i; max = *i; } } numbers.erase(j); return max; }
int main() { vector<int> numbers_max; vector<int> numbers_min; int n, m; cin>>n; for( int i = 0; i < n; i++ ) { cin>>m; numbers_max.push_back(m); } numbers_min = numbers_max; while(numbers_max.size() != 1) { int min1 = getTheMin(numbers_max); int min2 = getTheMin(numbers_max); numbers_max.push_back(min1*min2 + 1); } while(numbers_min.size() != 1) { int max1 = getTheMax(numbers_min); int max2 = getTheMax(numbers_min); numbers_min.push_back(max1*max2 + 1); } cout<<"最大值为:"<<numbers_max.back()<<endl; cout<<"最小值为:"<<numbers_min.back()<<endl; }
|