在整数集合S中寻找最大数整数C, 使 C = A + B,并且 A,B, C,都是S中的元素

题目:在整数集合S中寻找最大数整数C, 使 C = A + B,并且 A,B, C,都是S中的元素;


分析:将集合S中所有元素排序,生成一个有序的序列,利用偏序序列的传递性。贪心的优化策略。

1.首选对S中元素排序,升序。

2.     C = s[k] (k = len -1, ..... 2) ;

每次选最大的元素为C,对于每个C,选A为最小的元素,  选B为仅次于C的最大元素,通过传递性,使A+B的和逐渐逼近C。

 


代码实现:

#include <stdio.h>
#include <stdlib.h>

int cmp(const void *first, const void *second);
int maxElement(int s[], int len, int *a, int *b, int *c);

int main(int argc, char *argv[]) {
        int a[] = {1, 2, 3, 4, 4, 6, 8, 7};
        int x, y, z;

        if(maxElement(a, sizeof(a)/sizeof(a[0]), &x, &y, &z) ) {
                printf("%d + %d = %d \n", x, y, z);
        }

        return 0;
}

int maxElement(int s[], int len, int *a, int *b, int *c) {
        int i;
        int j;
        int k;

        //使用快速排序
        qsort(s, len, sizeof(a[0]), cmp);

        for(i = len - 1; i > 1; --i) {
                for(j = 0, k = i -1; j < k; ) {
                        if(s[j] + s[k] > s[i]) {
                                --k;
                                continue;
                        }

                        if(s[j] + s[k] < s[i]) {
                                ++j;
                                continue;
                        }

                        *a = s[j];
                        *b = s[k];
                        *c = s[i];

                        return 1; //存在返回1;
                }

        }

        return 0; //不存在
}


int cmp(const void *first, const void *second) {
        return *(int *)first - *(int *)second;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值