数列极差问题

在黑板上写了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张图片

你可能感兴趣的:(数列极差问题)