题意:
给你n个数,其中三个加起来等于得数也在n个数里面,就输出这个数。如果有多个,就输出最大那个。n<1000
思路
很简单,其实就是这样一个算式:
x+y+z=ans最简单就是枚举四个数,很显然会超时
枚举x,y,z也有可能会超时,这样就可以转换一下
ans-x-y=z,排序后从大枚举ans,x,y。很显然找到一个就可以了,因为是最大的ans,这里还有可能有负数,所以x或y有一个可能大于ans,所以就要注意一下查找范围。时间复杂度为(n*n*n)
const
maxn=1000007;
var
i,j,n,max:longint;
hash,a:array [0..maxn] of longint;
procedure qsort(l,r:longint);
var
i,j,mid:longint;
begin
i:=l; j:=r;
mid:=a[(l+r) div 2];
while i<j do
begin
while a[i]<mid do inc(i);
while a[j]>mid do dec(j);
if i<=j then
begin
a[0]:=a[i];
a[i]:=a[j];
a[j]:=a[0];
inc(i); dec(j);
end;
end;
if l<j then qsort(l,j);
if r>i then qsort(i,r);
end;
procedure insertion(x:longint);
var
i,j:longint;
begin
i:=abs(x) mod maxn;
while (hash[i]<>-maxlongint) and (hash[i]<>x) do i:=i mod maxn+1;
hash[i]:=x;
end;
function find(x:longint):boolean;
var
i,j:longint;
begin
i:=abs(x) mod maxn;
while (hash[i]<>-maxlongint) and (hash[i]<>x) do i:=i mod maxn+1;
if hash[i]=x then exit(true)
else exit(false);
end;
procedure init;
var
i,j,k,p:longint;
begin
max:=-maxlongint;
for i:=1 to n do
begin
readln(a[i]);
insertion(a[i]);
end;
qsort(1,n);
for i:=n downto 1 do
for j:=n downto 1 do
for k:=i-1 downto 1 do
if (j<>i) and (k<>j) then
begin
p:=a[i]-a[j]-a[k];
if (p<>a[i]) and (p<>a[j]) and (p<>a[k]) then
if find(p) then
begin
writeln(a[i]);
exit;
end;
end;
writeln('no solution');
end;
begin
readln(n);
while n<>0 do
begin
for i:=0 to maxn do
hash[i]:=-maxlongint;
init;
readln(n);
end;
end.