数列极差问题
题目:
在黑板上写了N个正整数组成的一个数列,进行如下操作:每次擦去其中的两个数a和b,然后在数列中加入一个数a×b+1,如此下去直至黑板上剩下一个数,在所有按这种操作方式最后得到的数中,最大的为max,最小的为min,则该数列的极差定义为M=max-min。
请你编程,对于给定的数列,计算极差。
输入
第一个数N表示正整数序列长度(0<=N<=50000),随后是N个正整数。
输出
在一行内输出结果。
输入样例
3 1 2 3
输出样例
2
题目大意:应该能明白,就是不断擦去两个数,最后只剩下一个数,要解决的问题就是怎样擦除剩下的数最大或者最小
从小到大排序,每次擦掉最大的两个数,然后剩下的就是最小的 注释*(程序调试出错可能是因为scanf 没加&)
从小到大排序,先擦掉两个最小的,插入a*b+1然后再进行排序,一定要记住每次擦掉的都是最小的两个数,那么剩下的就会是最大的
解题方法: 第一步:先要对你输入的一个数组进行排序,这里采用C++库函数sort进行排序
第二步:擦掉最大的两个数,然后插入a*b+1 继续擦掉最大的两个数
第三步:擦掉最大的两个数,然后插入a*b+1继续擦掉最小的两个数
源代码:
#include
#include
#include
using namespace std;
int main()
{
int i, j, n,min, max;
int num[1000];
while(scanf("%d", &n) == 1)
{
for(i = 0; i < n; i++)
{
scanf("%d", &num[i]);
}
sort(num, num+n);
min = num[n-1];
for(i = 0; i < n-1; i++)
{
min = min*num[n-i-2] + 1;
}
for(i = 0; i < n; i++)
{
num[i+1] = num[i]*num[i+1]+1;
for(j = i+1; j < n; j++)
{
if(num[j] > num[j+1])
{
swap(num[j], num[j+1]);
}
}
}
max = num[n-1];
printf("%d\n", max-min);
}
return 0;
}