您的位置:首页 > 其它

贪心算法练习:数列极差问题

2014-07-25 20:00 344 查看
在黑板上写n个正整数排成的一个数列,进行如下操作:
每次擦掉其中的两个数a和b,然后在数列里面加入一个数a*b+1,
如此循环往复直到黑板上只剩下一个数,在所有按这种操作方式
最后得到的数中,最大的记为max,最小的记min,则该数列的极差
定义为m=max-min。
输入一个正整数n,然后输入n个正整数构成一个数列。
输出这n个正整数构成的数列的极差。

#include<stdio.h>
#include<stdlib.h>
long maxNumber;//整个数组里面的最大的数
long maxNumberIndex;
long max(long *a,long len);
long min(long *a,long len);

int main()
{
long *a,*b,n,i,maxN,minN;
freopen("5.in","r",stdin);
scanf("%ld",&n);
a=(long *)malloc(sizeof(long)*n);
b=(long *)malloc(sizeof(long)*n);
for(i=0;i<n;i++)
{
scanf("%ld",a+i);
b[i]=a[i];
}
minN=min(b,n);//注意:必须先调用min()函数再调用max()函数
maxN=max(a,n);
//printf("%ld %ld\n%ld\n",maxN,minN,maxN-minN);
printf("%ld\n",maxN-minN);
return 0;
}
long max(long *a,long len)//返回相乘结果最大的那个乘积
{
long i,min1,min2,min1Index,min2Index,m;//min1,min2表示最小和次小的两个数的值。min1Index和min2Index表示最大和次大的两个数的下标
//注意:数组a里面最小和次小的两个数可以是一样大小,但不可能是下标相同的两个数 .
while(len>1)
{
min2=min1=maxNumber;
min2Index=min1Index=maxNumberIndex;
for(i=0;i<len;i++)
{
if(a[i]<min1)
{
min2=min1;
min2Index=min1Index;
min1=a[i];
min1Index=i;
}
else if(a[i]<min2)
{
min2=a[i];
min2Index=i;
}
}
m=min1*min2+1;

if(min1Index>min2Index)
{
a[min2Index]=m;
if(m>maxNumber)
{
maxNumber=m;//更新当前数组里面的最大值
maxNumberIndex=min2Index;
}
a[min1Index]=a[len-1];
len--;
}
else
{
a[min2Index]=a[len-1];
a[min1Index]=m;
if(m>maxNumber)
{
maxNumber=m;//更新当前数组里面的最大值
maxNumberIndex=min1Index;
}
maxNumberIndex=min1Index;
len--;
}
}
return a[0];
}
long min(long *a,long len)//返回相乘结果最小的那个乘积
{
long i,max1,max2,max1Index,max2Index,m;//max1,max2表示最大和次大的两个数的值。max1I和max2I表示最大和次大的两个数的下标
//注意:数组a里面最大和次大的两个数可以是一样大小,但不可能是下标相同的两个数 .
int f=0;
while(len>1)
{
max2=max1=-1;
max2Index=max1Index=-1;
for(i=0;i<len;i++)
{
if(a[i]>max1)
{
max2=max1;
max2Index=max1Index;
max1=a[i];
max1Index=i;
}
else if(a[i]>max2)
{
max2=a[i];
max2Index=i;
}
}
m=max1*max2+1;
if(f==0)
{
maxNumber=max1;//保存整个数组的最大值,以便在调用max()函数的时候方便寻找最小的两个数。
maxNumberIndex=max1Index;
f=1;
}
if(max1Index>max2Index)
{
a[max2Index]=m;
a[max1Index]=a[len-1];
len--;
}
else
{
a[max2Index]=a[len-1];
a[max1Index]=m;
len--;
}
}
return a[0];
}


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