在整数集合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
#include 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;
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
