码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-07-26 01:21:07      阅读:1446      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   io   for   art   


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

bubuko.com,布布扣
  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 long maxNumber;//整个数组里面的最大的数 
  4 long maxNumberIndex;
  5 long max(long *a,long len);
  6 long min(long *a,long len);
  7 
  8 int main()
  9 {
 10     long *a,*b,n,i,maxN,minN;
 11     freopen("5.in","r",stdin);
 12     scanf("%ld",&n);
 13     a=(long *)malloc(sizeof(long)*n);
 14     b=(long *)malloc(sizeof(long)*n);
 15     for(i=0;i<n;i++)
 16     {
 17         scanf("%ld",a+i);
 18         b[i]=a[i];
 19     }
 20     minN=min(b,n);//注意:必须先调用min()函数再调用max()函数 
 21     maxN=max(a,n);
 22     //printf("%ld %ld\n%ld\n",maxN,minN,maxN-minN);
 23     printf("%ld\n",maxN-minN);
 24     return 0;
 25 }
 26 long max(long *a,long len)//返回相乘结果最大的那个乘积 
 27 {
 28     long i,min1,min2,min1Index,min2Index,m;//min1,min2表示最小和次小的两个数的值。min1Index和min2Index表示最大和次大的两个数的下标 
 29     //注意:数组a里面最小和次小的两个数可以是一样大小,但不可能是下标相同的两个数 .
 30     while(len>1)
 31     {
 32         min2=min1=maxNumber;
 33         min2Index=min1Index=maxNumberIndex;
 34         for(i=0;i<len;i++)
 35         {
 36             if(a[i]<min1)
 37             {
 38                 min2=min1;
 39                 min2Index=min1Index;
 40                 min1=a[i];
 41                 min1Index=i;
 42             }
 43             else if(a[i]<min2)
 44             {
 45                 min2=a[i];
 46                 min2Index=i;
 47             }
 48         }
 49         m=min1*min2+1;
 50         
 51         if(min1Index>min2Index)
 52         {
 53             a[min2Index]=m;
 54             if(m>maxNumber)
 55             {
 56                 maxNumber=m;//更新当前数组里面的最大值 
 57                 maxNumberIndex=min2Index;
 58             }
 59             a[min1Index]=a[len-1];
 60             len--;
 61         }
 62         else 
 63         {
 64             a[min2Index]=a[len-1];
 65             a[min1Index]=m;
 66             if(m>maxNumber)
 67             {
 68                 maxNumber=m;//更新当前数组里面的最大值 
 69                 maxNumberIndex=min1Index;
 70             }
 71             maxNumberIndex=min1Index;
 72             len--;
 73         }
 74     }
 75     return a[0];
 76 }
 77 long min(long *a,long len)//返回相乘结果最小的那个乘积 
 78 {
 79     long i,max1,max2,max1Index,max2Index,m;//max1,max2表示最大和次大的两个数的值。max1I和max2I表示最大和次大的两个数的下标 
 80     //注意:数组a里面最大和次大的两个数可以是一样大小,但不可能是下标相同的两个数 .
 81     int f=0;
 82     while(len>1)
 83     {
 84         max2=max1=-1;
 85         max2Index=max1Index=-1;
 86         for(i=0;i<len;i++)
 87         {
 88             if(a[i]>max1)
 89             {
 90                 max2=max1;
 91                 max2Index=max1Index;
 92                 max1=a[i];
 93                 max1Index=i;
 94             }
 95             else if(a[i]>max2)
 96             {
 97                 max2=a[i];
 98                 max2Index=i;
 99             }
100         }
101         m=max1*max2+1;
102         if(f==0)
103         {
104             maxNumber=max1;//保存整个数组的最大值,以便在调用max()函数的时候方便寻找最小的两个数。 
105             maxNumberIndex=max1Index;
106             f=1;
107         }
108         if(max1Index>max2Index)
109         {
110             a[max2Index]=m;
111             a[max1Index]=a[len-1];
112             len--;
113         }
114         else 
115         {
116             a[max2Index]=a[len-1];
117             a[max1Index]=m;
118             len--;
119         }
120     }
121     return a[0];
122 }
View Code

 

贪心算法练习:数列极差问题,布布扣,bubuko.com

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

标签:style   blog   http   color   os   io   for   art   

原文地址:http://www.cnblogs.com/huashanqingzhu/p/3868860.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!