题目:http://poj.org/problem?id=2549
http://acm.hit.edu.cn/hoj/problem/view?id=1879
本题是著名的Open Problem之3SUM问题,题目描述:http://en.wikipedia.org/wiki/3SUM
即:在一个集合S中找到数a,b,c,使得a + b + c =0,可以暴力求解,也可以用上面链接的O(n^2)的做法:先做排序,左右同时遍历。
本题Sumsets这道题目要求一个集合S中找到数a,b,c,d,求出最大的d,使得a + b + c =d,方法是一样的,穷举d即可。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <stack>
#include <queue>
#include <map>
#include <string>
using namespace std;
int s[1005];
int cmp(int a,int b)
{
if(a == b) return true;
return false;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int n;
while(scanf(" %d",&n)!=EOF && n!=0)
{
for(int i=0; i<n; i++)
{
scanf(" %d",&s[i]);
}
sort(s,s+n);
n = unique(s,s+n,cmp) - s;
int flag = 0;
int ans = 0;
for(int i=n-1; i>=0; i--)
{
int d = s[i];
for(int j=0; j<=n-3; j++)
{
int a = s[j];
int k = j+1;
int l = n-1;
int b,c;
if(i == j)
{
continue;
}
while(k<l)
{
if(i == k)
{
k++;
}
if(i == l)
{
l--;
}
if(k<l)
{
b = s[k];
c = s[l];
if(a + b + c == d)
{
flag = 1;
ans = d;
break;
}
else if(a + b + c > d)
{
l--;
}
else if(a + b + c < d)
{
k++;
}
}
}
if(flag == 1)
{
break;
}
}
if(flag == 1)
{
break;
}
}
if(flag == 1)
{
printf("%d\n",ans);
}
else
{
printf("no solution\n");
}
}
return 0;
}