要求求出集合S中a + b + c = d中最大的d值。暴力的枚举一定超时的,所以需要找到一个优化的方式枚举,可以转化成 a + b = d - c.将集合排序,从大到小枚举d和c。然后在从1到c的前一位枚举。最后输出d即可
/*************************************************************************
> File Name: 10125.cpp
> Author: Toy
> Mail: ycsgldy@163.com
> Created Time: 2013年05月30日 星期四 20时40分52秒
************************************************************************/
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstring>
#include <cstdlib>
#include <climits>
#include <sstream>
#include <fstream>
#include <cstdio>
#include <string>
#include <vector>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
#include <set>
using namespace std;
const int INF = 0x7fffffff;
int Case;
int A[1010], ii;
int main ( ) {
while ( scanf ( "%d", &Case ) == 1 && Case ) {
for ( int i = 1; i <= Case; ++i )
scanf ( "%d", &A[i] );
sort ( A + 1, A + Case + 1 );
bool flag = 0;
for ( int i = Case; i >= 1; --i ) {
for ( int j = Case; j >= 1; --j ) {
if ( j != i ) {
int tmp = A[i] - A[j];
int lift = 1, right = j - 1;
while ( lift < right ) {
int cnt = A[lift] + A[right];
if ( cnt == tmp ) { ii = i, flag = 1; break; }
else if ( cnt < tmp ) lift++;
else right--;
}
}
if ( flag ) break;
}
if ( flag ) break;
}
if ( flag ) printf ( "%d\n", A[ii] );
else printf ( "no solution\n" );
}
return 0;
}