数列极差问题

来源:互联网 发布:2016淘宝开店教程视频 编辑:程序博客网 时间:2024/05/24 05:45

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

问题分析:下面通过实例来认识题目中描述的计算过程。对3个具体的数据3,5,7,讨论,可能有一下3种结果:
(3*5+1)*7+1 = 113,(3*7+1)*5+1=111,(5*7+1)*3+1=109
由此可见,先运算小数据得到的是最大值,先运算大数据得到的是最小值。

C++源代码如下所示:

#include <iostream>#include <vector>#include <string>using namespace std;//计算最大值int calculateMax(vector<int> &v){    size_t sz = v.size();    if (sz == 1)    {        return v[0];    }    vector<int>::iterator ita,itb;    //每次找出v中最小的两个数*ita、*itb,然后合并成(*ita)*(*itb)+1    while (v.size() > 2)    {        ita = v.begin();        itb = ita +1;        if (*itb < *ita)        {            int tmp;            tmp = *ita;            *ita = *itb;            *itb = tmp;        }        for (vector<int>::iterator it = itb+1;it != v.end();++it)        {            if (*it < *ita)            {                itb = ita;                ita = it;            }            else if (*it < *itb)            {                itb = it;            }        }        *ita = (*ita)*(*itb)+1;        v.erase(itb);    }    return v[0]*v[1]+1;}//计算最小值int calculateMin(vector<int> &v){    size_t sz = v.size();    if (sz == 1)    {        return v[0];    }    vector<int>::iterator ita,itb;    //每次找出v中最大的两个数v[i]、v[j],然后合并成v[i]*v[j]+1    while (v.size() > 2)    {        ita = v.begin();        itb = ita +1;        if (*itb > *ita)        {            int tmp;            tmp = *ita;            *ita = *itb;            *itb = tmp;        }        for (vector<int>::iterator it = itb+1;it != v.end();++it)        {            if (*it > *ita)            {                itb = ita;                ita = it;            }            else if (*it > *itb)            {                itb = it;            }        }        //用(*ita)*(*itb)+1代替*ita,然后将itb删除        *ita = (*ita)*(*itb)+1;        v.erase(itb);    }    return v[0]*v[1]+1;}int main(){    vector<int> v;    v.push_back(3);    v.push_back(5);    v.push_back(4);    v.push_back(7);    vector<int> v1(v);    vector<int> v2(v);    int max_num = calculateMax(v1);    int min_num = calculateMin(v2);    cout<<max_num<<'-'<<min_num<<'='<<max_num - min_num<<endl;    return 0;}// 3 5 4 7

运行结果:
这里写图片描述

1 0
原创粉丝点击