贪心算法之数列极差问题

1.问题:在黑板上写了N个正整数作成的一个数列,进行如下操作:每次擦去其中的两个数a和b,然后在数列中加入一个数a*b+1,如此下去直到黑板上剩下一个数,在所有按这种方式,最后得到的数中,最大的计作Max、最小的计做Min,求该数列的极差M=Max-Min?

2.设计思路:max是每一次取出数组中最小的两个数,进行a*b+1;min是每一次取出数组中最大的两个数,进行a*b+1;所以需要分别找出数组中最大和最小的两个数进行计算,把计算结果加入数组,同时在原来数组中删除a和b;一直循环,直到数组中的元素个数为1时退出;分别随着最大和最小的值,找到两个最小/最大的元素下标,需要把其中一个置为最大、最小,下一次就不会去除这个元素了。因为每一次都会破坏原来的数组,所以需要复制数组中的元素到新的数组,进行其他操作。

3.代码:

/*数列极差问题*/
#include <stdio.h>
#define N 3
#define MAX 0x7fffffff//32位2进制最大数
#define MIN 0x80000000//32位2进制最小数
int array[N]={3,7,5};
int array2[N];
int FindMax()	 
{
	int max=MIN;
	int maxindex=0;			 //初始最大元素的下标为0 
	for(int i=0;i<N;i++)	//查找数组中最大的元素下标 
	{
		if(array2[i]>max)
		{
			max=array2[i];	//取较大的值 
			maxindex=i;
			//printf("max1=%d\n",i);
		 } 
	}
	return maxindex; 
 } 
  
int FindMin()
{
	//printf("n2=%d\n",n);
	int min=MAX;
	int minindex=0;			//初始最小元素的下标为0
	for(int i=0;i<N;i++)	//查找数组中最小的元素下标
	{
		if(array[i]<min)
		{
			min=array[i];
			minindex=i;
		}
	 } 
	return minindex;
}

int GetMax(int array[],int n)		//max=每次从数组中取出两个最小的数进行a*b+1计算 
{
	int a,b;						
	int max=0;
	int i=0,j=0;					//记录下标
	while(n>1)
	{
		i=FindMin();		//取数组中最小元素的下标
		a=array[i];
		//printf("a=%d\n",a);
		array[i]=MAX;			//把此位置赋值为最大值的,下一次就不会取出它 
		j=FindMin();			
		b=array[j];
		//printf("b=%d\n",b);
		array[j]=a*b+1;			//把计算结果放入数组 
		n--;
	 } 
	 //printf("j=%d\n",j);
	 //printf("array[j]=%d\n",array[j]);
	return max=array[FindMin()];		//最后在找到数组中第二大的数,也就是仅小于MAX 
 } 
 
int GetMin(int array[],int n)		//min=每次从数组中取出两个最大的数进行a*b+1计算 
{
	int a,b;						
	int min=0;
	int i,j;					//记录下标
	while(n>1)
	{
		i=FindMax();		//取数组中最大元素的下标
		a=array[i];
		printf("a=%d\n",a);
		array[i]=MIN;			//把此位置赋值为最小值的,下一次就不会取出它 
		j=FindMax();			
		b=array[j];
		printf("b=%d\n",b);
		array[j]=a*b+1;			//把计算结果放入数组 
		n--;
	 } 
	return min=array[FindMax()];		//最后在找到数组中第二小的数,也就是仅大于MIN   
 } 
 
int main()
{
	for(int i=0;i<N;i++)		//复制array数组,方便寻找寻找最小值的操作 
	{
		array2[i]=array[i];
	}
	for(int i=0;i<N;i++)		//复制array数组,方便寻找寻找最小值的操作 
	{
		printf("array2=%d ",array2[i]);
	}
	int max=0,min=0;
	max=GetMax(array,N);
	printf("MIN=%d\n",MIN);
	min=GetMin(array2,N);
	printf("最大的数为:%d\n",max); 
	printf("最小的数为:%d\n",min);
	printf("数列极差M=:%d\n",max-min);
	return 0;  
}

4.运行结果:

 

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值