题目:在整数集合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;
}