贪心算法练习:数列极差问题
2014-07-25 20:00
344 查看
在黑板上写n个正整数排成的一个数列,进行如下操作:
每次擦掉其中的两个数a和b,然后在数列里面加入一个数a*b+1,
如此循环往复直到黑板上只剩下一个数,在所有按这种操作方式
最后得到的数中,最大的记为max,最小的记min,则该数列的极差
定义为m=max-min。
输入一个正整数n,然后输入n个正整数构成一个数列。
输出这n个正整数构成的数列的极差。
View Code
每次擦掉其中的两个数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
相关文章推荐
- 贪心算法基础(一)——数列极差
- 贪心算法练习:乘船问题
- 贪心算法解决数列作为顶点度数构造无向图问题
- 数列极差问题(贪心) 求数据(一直Wrong)
- 贪心算法解决找零钱问题
- 贪心算法之删数问题
- 贪心算法之最优装载问题
- 蛙蛙推荐:算法练习:最大间隙问题
- 贪心算法运用于(0/1)背包问题
- 贪心算法之多机调度问题
- 理解动态规划算法与贪心算法区别----找钱问题
- 贪心算法之最优装船问题
- 活动安排问题之贪心算法
- Dijkstra算法是解单源最短路径问题的一个贪心算法
- 贪心算法解决部分背包问题
- 贪心算法 安排活动的问题 最大限度的利用有限资源
- 贪心算法问题
- 贪心算法——部分背包问题(贪心策略内容)
- 贪心算法——活动安排问题
- 用贪心算法解决背包问题(物品可分割)