zoj Gamblers(hash)

题意:

给你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.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值