数列极差问题

在黑板上写了N个正整数组成的一个数列,进行如下操作: 每次擦去其中的两个数a和b,然后在数列中加入一个数a×b+1,如此下去直至黑板上 剩下一个数,在所有按这种操作方式最后得到的数中,最大的为max,最小的为min, 则该数列的极差定义为M=max-min。

贪心算法:每次擦出数列中的两个最小数,产生最大值max;

              每次擦出数列中的两个最大数,产生最小值min;

 

ContractedBlock.gif ExpandedBlockStart.gif Code
 1#include <stdio.h>
 2#include <string.h>
 3#define clr(a) memset(a,0,sizeof(a))
 4
 5int n, data[50001];
 6
 7void bubble_sort();
 8int cal_max(int data[]);
 9int cal_min(int data[]);
10
11int main()
12ExpandedBlockStart.gifContractedBlock.gif{
13    int i, max, min;
14    
15ExpandedSubBlockStart.gifContractedSubBlock.gif    while(scanf("%d"&n) && n>0){
16        for(i=1; i<=n; i++)
17            scanf("%d"&data[i]);
18        bubble_sort();
19ExpandedSubBlockStart.gifContractedSubBlock.gif/**//*        for(i=1; i<=n; i++)
20            printf("%-3d", data[i]);          */

21        max = cal_max(data);
22        min = cal_min(data);
23ExpandedSubBlockStart.gifContractedSubBlock.gif/**//*        printf("max=%d  min=%d\n", max, min); */
24        printf("%d\n", max-min);
25    }

26
27    return 0;
28}

29
30void bubble_sort()
31ExpandedBlockStart.gifContractedBlock.gif{
32    int i, j;
33
34    for(i=n; i>1; i--)
35ExpandedSubBlockStart.gifContractedSubBlock.gif        for(j=1; j<i; j++){
36ExpandedSubBlockStart.gifContractedSubBlock.gif            if(data[j] > data[j+1]){
37                int temp = data[j];
38                data[j] = data[j+1];
39                data[j+1=  temp;
40            }

41        }

42}

43
44int cal_max(int data[])
45ExpandedBlockStart.gifContractedBlock.gif{
46    int temp, t=1, i, j, a[50001];
47    
48    for(i=1; i<=n; i++)
49        a[i] = data[i];
50ExpandedSubBlockStart.gifContractedSubBlock.gif    while(t < n){
51        temp = a[t]*a[t+1+ 1;
52        i = t+2;
53        while(a[i]<temp && i<=n)
54            i++;
55        for(j=t+2; j<i; j++)
56            a[j] = a[j+1];
57        a[i-1= temp;
58        t ++;
59    }

60    return temp;
61}

62
63int cal_min(int data[])
64ExpandedBlockStart.gifContractedBlock.gif{
65    int temp, t=n, i, j, a[50001];
66    
67    for(i=1; i<=n; i++)
68        a[i] = data[i];
69ExpandedSubBlockStart.gifContractedSubBlock.gif    while(t > 1){
70        temp = a[t]*a[t-1+ 1;
71        i = t-2;
72        while(a[i]>temp && i>=1)
73            i--;
74        for(j=t-2; j>i; j--)
75            a[j] = a[j-1];
76        a[i+1= temp;
77        t --;
78    }

79    return temp;
80}

转载于:https://www.cnblogs.com/XiaoS/archive/2008/11/30/1344596.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值