您的位置:首页 > 其它

数列极差问题

2016-04-19 19:22 302 查看
在黑板上写了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


运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: