这个题的关键在于可以有负数,所以要注意循环变量的取值范围!!!
还有注意二分查找!!!不要用递归!TLE!!
#include <iostream>
#include <algorithm>
#include <stdio.h>
#define MAXN 1005
using namespace std;
int p[MAXN];
int N;
/*int midfind(int l,int r,int x)
{
int i;
if(l==r)
{
return l;
}
int mid=(l+r)/2;
if(x<=p[mid])
{
i=midfind(r,mid,x);
}
else
{
i=midfind(l,mid,x);
}
return i;
}*///递归的二分!!!TLE!!!
int midfind(int k,int val) //这才叫二分查找!!!
int left,right,mid;
left = k+1; right = N-1;
while(left<=right)
{
mid = (left+right)>>1;
if(p[mid] == val) return mid;
if(p[mid] < val) right = mid-1;
else left = mid+1;
}
return 0;
}
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
while(scanf("%d",&N)!=EOF&&N)
{
int flag=0;
int ans=-1;
int a;
for(int i=0;i<N;i++)
{
scanf("%d",&p[i]);
}
sort(p,p+N,cmp);
for(int i=0;i<N;i++)
{
for(int j=0;j<N-2;j++)//注意j从0开始!!不是从i+1开始!!!
{
for(int l=j+1;l<N-1;l++)
{
a=midfind(l,p[i]-p[j]-p[l]);
if(a!=0&&a!=i&&l!=i&&j!=i)
{
flag=1;
ans=p[i];
break;
}
}
if(flag==1)
break;
}
if(flag==1)
{
break;
}
}
if(a>0)
{
printf("%d\n",ans);
}
else
printf("no solution\n");
}
return 0;
}