由此题目了解到有一个3sum算法,自己又将a+b存起来用二分查找AC了,不过3sum的时间复杂度高些但耗时反倒少些。。。。
ACcode:
/**
3sum O(n^3)
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 1005;
bool flag;
int n, d, num, s[MAXN];
int main()
{
while (~scanf("%d",&n),n)
{
num=1,flag=true;
for (int i=0;i<n;i++) scanf("%d",s+i);
sort(s,s+n);
for (int i=1;i<n;i++)
if (s[i]!=s[i-1]) s[num++]=s[i];
n=num;
for (d=n-1;d>=0&&flag;--d)
{
for (int i=0;i<n-3&&flag;i++)
{
int j=i+1,k=n-1;
while (j<k)
{
long long t=s[i]+s[j]+s[k];
if (t==s[d])
{
if (i==d||j==d||k==d) break;
flag=false;
n=t;
break;
}
else if (t>s[d]) k--;
else j++;
}
}
}
if (flag) printf("no solution\n");
else printf("%d\n",n);
}
return 0;
}
/**
二分查找O(n^2*log(n))
*/
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int nsize=1111;
struct ad
{
int a,b,s;
ad(){};
ad(int x,int y,int z)
{
a=x,b=y,s=z;
}
}t[nsize*1000];
int n,k,d,c[nsize],top;
bool cmp(ad a1,ad a2)
{
if (a1.s==a2.s) return a1.a<a2.a;
return a1.s<a2.s;
}
int Fin(int x,int y)
{
int low=0,high=top-1;
while (low<=high)
{
int mid=(low+high)>>1;
if (t[mid].s==x)
{
if (y==t[mid].a||y==t[mid].b)
{
if (mid>0&&t[mid-1].s==x) return 1;
if (mid<top-1&&t[mid+1].s==x) return 1;
return 0;
}
else return 1;
}
else if (t[mid].s>x) high=mid-1;
else low=mid+1;
}
return 0;
}
int main()
{
while (~scanf("%d",&n),n)
{
for (int i=0;i<n;i++) scanf("%d",&c[i]);
sort(c,c+n);
k=1,top=0;
for (int i=1;i<n;i++)
if (c[i]!=c[i-1]) c[k++]=c[i];
n=k;
for (int i=0;i<n;i++)
{
for (int j=i+1;j<n;j++)
{
t[top++]=ad(c[i],c[j],c[i]+c[j]);
}
}
sort(t,t+top,cmp);
bool flag=true;
for (int i=n-1;i>=0&&flag;i--)
{
for (int j=i-1;j>=0&&flag;j--)
{
d=c[i],k=c[j];
if (Fin(d-k,k)&&Fin(d-k,d))
{
flag=false;
printf("%d\n",d);
}
}
}
if (flag) printf("no solution\n");
}
return 0;
}