【NOI2010】 成长快乐

这里存放这道题的程序,题解在:http://blog.sina.com.cn/s/blog_86942b1401015c3u.html

case 1: 手算。

case 2:搜索

program nemo4;
{for case 2}
const zero=1e-10;
      max=10000000;
type
  ty1=record
    w,x,y,p,q:extended;
  end;
  ty2=record
    t,x,y:extended;
    s:longint;
  end;

var
  v,w,x,y,tot_t,all:extended;
  n,i,tot:longint;
  fish:array[0..10000] of ty1;
  step,tmp:array[0..10000] of ty2;
  get:array[0..10000] of boolean;
//==============================
procedure find(s:longint; x,y,w,now:extended);
var
  j:longint;
  a,b,c,d,fx,fy,t:extended;
begin
  if (s=n+1)or(now-tot_t>zero) then exit;

  for j:=1 to n do
  if not get[j] and (fish[j].w-w<-zero) then
  begin
    fx:=fish[j].x+fish[j].p*now;
    fy:=fish[j].y+fish[j].q*now;
    a:=sqr(v)-sqr(fish[j].p)-sqr(fish[j].q);
    b:=2*fish[j].p*(x-fx)+2*fish[j].q*(y-fy);
    c:=-sqr(x-fx)-sqr(y-fy);
    t:=max;
    if abs(a)<zero then
    begin
      if abs(b)<zero then continue;
      if -c/b>-zero then t:=-c/b;
    end else
    begin
      if sqr(b)-4*a*c<-zero then continue;
      d:=(-b+sqrt(sqr(b)-4*a*c))/(2*a);
      if d>-zero then t:=d;
      d:=(-b-sqrt(sqr(b)-4*a*c))/(2*a);
      if (d>-zero)and(d>t) then t:=d;
    end;
    if t-max>-zero then continue;
    tmp[s+1].x:=fx+fish[j].p*t;
    tmp[s+1].y:=fy+fish[j].q*t;
    tmp[s+1].s:=j;
    tmp[s+1].t:=now+t;
    get[j]:=true;
    find(s+1,tmp[s+1].x,tmp[s+1].y,w+fish[j].w,now+t);
    get[j]:=false;
  end;

  if all-w<-zero then
  begin
    tot:=s; all:=w;
    for j:=1 to s do step[j]:=tmp[j];
  end;
end;
//==============================
begin
  assign(input,'nemo2.in'); reset(input);
  assign(output,'nemo2.out'); rewrite(output);
  read(w,v,tot_t,x,y);
  read(n); tot:=0; all:=0;
  for i:=1 to n do read(fish[i].w,fish[i].x,fish[i].y,fish[i].p,fish[i].q);
  find(0,x,y,w,0);
  writeln(tot);
  writeln(all-w:0:6);
  for i:=1 to tot do
  writeln(step[i].t:0:6,' ',step[i].x:0:6,' ',step[i].y:0:6,' ',step[i].s);
  close(input); close(output);
end.

 

case 3:模拟:

program nemo3;
{for case 3}
const zero=1e-10;
      max=100000000;
type
  ty1=record
    w,x,y,p,q:extended;
  end;
  ty2=record
    t,x,y:extended;
    s:longint;
  end;

var
  v,w,x,y,tot_t,a,b,c,d,now,time,all:extended;
  n,i,j,t,tot:longint;
  fish:array[0..10000] of ty1;
  step:array[0..10000] of ty2;
  dis:array[0..10000] of extended;
  get:array[0..10000] of boolean;
//==============================
begin
  assign(input,'nemo3.in'); reset(input);
  assign(output,'nemo3.out'); rewrite(output);
  read(w,v,tot_t,x,y);
  read(n); time:=0; tot:=0; all:=0;
  for i:=1 to n do read(fish[i].w,fish[i].x,fish[i].y,fish[i].p,fish[i].q);
  for i:=1 to n do
  begin
    for j:=1 to n do dis[j]:=max;
    for j:=1 to n do
    if not get[j] and (fish[j].w-w<-zero) then
    begin
      a:=sqr(v)-sqr(fish[j].p)-sqr(fish[j].q);
      b:=2*fish[j].p*(x-fish[j].x)+2*fish[j].q*(y-fish[j].y);
      c:=-sqr(x-fish[j].x)-sqr(y-fish[j].y);
      if abs(a)<zero then
      begin
        if abs(b)<zero then continue;
        dis[j]:=-c/b;
        if dis[j]<-zero then dis[j]:=max;
      end else
      begin
        if sqr(b)-4*a*c<-zero then continue;
        d:=(-b+sqrt(sqr(b)-4*a*c))/(2*a);
        if d>-zero then dis[j]:=d;
        d:=(-b-sqrt(sqr(b)-4*a*c))/(2*a);
        if d>-zero then dis[j]:=d;
      end;
    end;
    now:=max; t:=0;
    for j:=1 to n do
    if not get[j] and (fish[j].w-w<-zero) and (now-dis[j]>zero) then
    begin
      t:=j;
      now:=dis[j];
    end;
    if t=0 then break;
    time:=time+now;
    if time-tot_t>zero then break;
    get[t]:=true;
    inc(tot);
    step[tot].x:=fish[t].x+fish[t].p*now;
    step[tot].y:=fish[t].y+fish[t].q*now;
    step[tot].s:=t;
    step[tot].t:=time;
    x:=step[tot].x; y:=step[tot].y;
    w:=w+fish[t].w;
    all:=all+fish[t].w;
    for j:=1 to n do
    if not get[j] then
    begin
      fish[j].x:=fish[j].x+fish[j].p*now;
      fish[j].y:=fish[j].y+fish[j].q*now;
    end;
  end;
  writeln(tot);
  writeln(all:0:6);
  for i:=1 to tot do
  writeln(step[i].t:0:6,' ',step[i].x:0:6,' ',step[i].y:0:6,' ',step[i].s);
  close(input); close(output);
end.

 

case 4 and 10:随机化贪心

program nemo5;
{for case 4/10}
const zero=1e-10;
      max=10000000;
type
  ty1=record
    w,x,y,p,q:extended;
  end;
  ty2=record
    t,x,y:extended;
    s:longint;
  end;
var
  v,w0,x0,y0,tot_t,all,x,y:extended;
  n,tot,i,tot_s,t:longint;
  fish:array[0..10000] of ty1;
  step,tmp:array[0..10000] of ty2;
  get:array[0..10000] of boolean;
  sx:array[0..10000] of longint;
  s:array[0..10000] of extended;
//==============================
procedure sort(l,r:longint);
var
  i,j,tmp1:longint;
  tmp2,m:extended;
begin
  i:=l; j:=r; m:=s[(i+j) >> 1];
  repeat
    while s[i]>m do inc(i);
    while s[j]<m do dec(j);
    if i<=j then
    begin
      tmp1:=sx[i]; sx[i]:=sx[j]; sx[j]:=tmp1;
      tmp2:=s[i]; s[i]:=s[j]; s[j]:=tmp2;
      inc(i); dec(j);
    end;
  until i>j;
  if i<r then sort(i,r);
  if j>l then sort(l,j);
end;
//==============================
function calc(t:longint; x,y,now:extended):extended;
var
  fx,fy,a,b,c,d,k:extended;
begin
  k:=max;
  fx:=fish[t].x+now*fish[t].p;
  fy:=fish[t].y+now*fish[t].q;
  a:=sqr(v)-sqr(fish[t].p)-sqr(fish[t].q);
  b:=2*fish[t].p*(x-fx)+2*fish[t].q*(y-fy);
  c:=-sqr(x-fx)-sqr(y-fy);
  if abs(a)<zero then
  begin
    if abs(b)<zero then exit(k);
    if -c/b>-zero then k:=-c/b;
  end else
  begin
    if sqr(b)-4*a*c<-zero then exit(k);
    d:=(-b+sqrt(sqr(b)-4*a*c))/(2*a);
    if d>-zero then k:=d;
    d:=(-b-sqrt(sqr(b)-4*a*c))/(2*a);
    if (d>-zero)and(d>k) then k:=d;
  end;
  exit(k);
end;
//==============================
procedure insert(fx:longint; now:extended);
begin
  inc(tot_s);
  s[tot_s]:=fish[fx].w/sqr(sqr(calc(fx,x,y,now)));
  sx[tot_s]:=fx;
end;
//==============================
function get_rand:longint;
var
  i,j,k:longint;
begin
  for j:=1 to tot_s do
  if (s[j]-s[j+1])/s[j]>0.031 then break;
  for k:=1 to j do
  if random(maxlongint) and 1=1 then break;
  for i:=1 to k do
  begin
    if random() < exp(-10/t) then break;
  end;
  exit(sx[i]);
end;
//==============================
procedure main;
var
  now,w,turn:extended;
  now_tot,t,j,i:longint;
begin
  fillchar(get,sizeof(get),0);
  fillchar(tmp,sizeof(tmp),0);
  now:=0; now_tot:=0; x:=x0; y:=y0; w:=w0;
  for j:=1 to n do
  begin
    tot_s:=0;
    for i:=1 to n do
    if not get[i] and(fish[i].w-w<-zero) then insert(i,now);
    sort(1,tot_s);
    if tot_s<1 then break;
    t:=get_rand;
    turn:=calc(t,x,y,now);
    if turn>max-1000 then continue;
    now:=now+turn;
    if now-tot_t>zero then break;
    get[t]:=true;
    inc(now_tot);
    tmp[now_tot].x:=fish[t].x+fish[t].p*now;
    tmp[now_tot].y:=fish[t].y+fish[t].q*now;
    tmp[now_tot].s:=t;
    tmp[now_tot].t:=now;
    x:=tmp[now_tot].x; y:=tmp[now_tot].y;
    w:=w+fish[t].w;
  end;
  if w>all then
  begin
    tot:=now_tot;
    all:=w;
    step:=tmp;
  end;
end;
//==============================
begin
  assign(input,'nemo10.out'); reset(input);
  readln(tot); readln(all);
  for i:=1 to tot do
  read(step[i].t,step[i].x,step[i].y,step[i].s);
  close(input);
  assign(input,'nemo10.in'); reset(input);
  assign(output,'nemo10.out'); rewrite(output);
  randomize;
  read(w0,v,tot_t,x0,y0);
  read(n); all:=all+w0;
  for i:=1 to n do read(fish[i].w,fish[i].x,fish[i].y,fish[i].p,fish[i].q);
  t:=20;
  while t>0 do
  begin
    main;
    dec(t);
  end;
  writeln(tot);
  writeln(all-w0:0:6);
  for i:=1 to tot do
  writeln(step[i].t:0:6,' ',step[i].x:0:6,' ',step[i].y:0:6,' ',step[i].s);
  close(input); close(output);
end.

 

case 5/6:接元宝

program nemo6;
{for case 5/6}
const zero=1e-10;
type
  ty1=record
    w,x,y,p,q:extended;
  end;
  ty2=record
    t,x,y:extended;
    s:longint;
  end;
var
  v,w0,x0,y0,tot_t,all,best:extended;
  n,tot,i,j,t:longint;
  fish:array[0..10000] of ty1;
  step:array[0..10000] of ty2;
  f,fall:array[0..10000] of extended;
  sa,g:array[0..10000] of longint;
//====================
procedure sort(l,r:longint);
var
  i,j,tmp1:longint;
  tmp2,m:extended;
begin
  i:=l; j:=r; m:=fall[(i+j) >> 1];
  repeat
    while fall[i]<m do inc(i);
    while fall[j]>m do dec(j);
    if i<=j then
    begin
      tmp2:=fall[i]; fall[i]:=fall[j]; fall[j]:=tmp2;
      tmp1:=sa[i]; sa[i]:=sa[j]; sa[j]:=tmp1;
      inc(i); dec(j);
    end;
  until i>j;
  if i<r then sort(i,r);
  if j>l then sort(l,j);
end;
//====================
function check(l,r:longint):boolean;
begin
  if abs(fish[sa[l]].x-fish[sa[r]].x)/v+fall[l]-fall[r]>zero then exit(false);
  exit(true);
end;
//====================
procedure huisu(x:longint);
begin
  if g[x]>0 then huisu(g[x]);
  inc(tot);
  all:=all+fish[sa[x]].w;
  step[tot].s:=sa[x];
  step[tot].x:=fish[sa[x]].x;
  step[tot].t:=fall[x];
end;
//====================
begin
  assign(input,'nemo6.in'); reset(input);
  assign(output,'nemo6.out'); rewrite(output);
  randomize;
  read(w0,v,tot_t,x0,y0);
  read(n); all:=0;
  for i:=1 to n do
  begin
    read(fish[i].w,fish[i].x,fish[i].y,fish[i].p,fish[i].q);
    fall[i]:=abs(fish[i].y-y0)/abs(fish[i].q);
    sa[i]:=i;
  end;
  sort(1,n);
  for i:=1 to n do f[i]:=-100000000;
  f[0]:=0;
  for i:=1 to n do
  begin
    for j:=0 to i-1 do
    if check(j,i) and (f[i]<f[j]+fish[sa[i]].w) then
    begin
      f[i]:=f[j]+fish[sa[i]].w;
      g[i]:=j;
    end;
    if best<f[i] then
    begin
      best:=f[i];
      t:=i;
    end;
  end;
  huisu(t);
  writeln(tot);
  writeln(all:0:6);
  for i:=1 to tot do
  writeln(step[i].t:0:6,' ',step[i].x:0:6,' ',step[i].y:0:6,' ',step[i].s);
  close(input); close(output);
end.

 

case 7/8:数字三角形

program nemo2;
{for case7/8}
uses math;
type
  ty=record
    t,x,y:extended;
    s:int64;
  end;

var
  n,tx,tot,p,q,maxq,ans,wi:int64;
  i,j:longint;
  w,v,t,x0,y0,time:extended;
  fash,id:array[0..2000,0..2000] of int64;
  step:array[0..2000] of ty;
  f,g:array[0..2000,0..2000] of int64;
//===============================
procedure huisu(x,y:int64);
begin
  if x>1 then huisu(x-1,g[x,y]);
  inc(tot);
  //writeln(x,' ',y);
  time:=time+sqrt(sqr(x-y0)+sqr(y-x0))/v;
  step[tot].t:=time;
  step[tot].x:=y; step[tot].y:=x;
  x0:=y; y0:=x;
  step[tot].s:=id[x,y];
end;
//===============================
begin
  assign(input,'nemo7.in'); reset(input);
  assign(output,'nemo7.out'); rewrite(output);
  read(w,v,t,x0,y0);
  read(n);
  fillchar(fash,sizeof(fash),$fe);
  for i:=1 to n do
  begin
    read(wi);
    read(p,q); fash[q,p]:=wi;
    id[q,p]:=i;
    if maxq<q then maxq:=q; read(p,q);
  end;
  fillchar(f,sizeof(f),$fe);
  for i:=0 to 2000 do
  f[0,i]:=0;
  for i:=1 to maxq do
  for j:=0 to 2000 do
  if f[i-1,j+1]>f[i-1,j-1] then
  begin
    f[i,j]:=f[i-1,j+1]+fash[i,j];
    g[i,j]:=j+1;
  end else
  begin
    f[i,j]:=f[i-1,j-1]+fash[i,j];
    g[i,j]:=j-1;
  end;
  for i:=0 to 2000 do
  if ans<f[maxq,i] then
  begin
    ans:=f[maxq,i];
    tx:=i;
  end;
  writeln(maxq);
  writeln(extended(ans):0:6);
  time:=0;
  huisu(maxq,tx);
  for i:=1 to maxq do
  writeln(step[i].t:0:6,' ',step[i].x:0:6,' ',step[i].y:0:6,' ',step[i].s);
  close(input); close(output);
end.

 

case 9:贪心:

program nemo;
{for case 9}
const max=10000000;
      zero=1e-6;
type
  ty1=record
    w,x,y,p,q:extended;
  end;
  ty2=record
    t,x,y:extended;
    s:longint;
  end;
var
  w,x,y,v,tot_t,now_t,ans,d:extended;
  n,i,j,t,tot:longint;
  f:array[0..10000] of ty1;
  get:array[0..10000] of boolean;
  step:array[0..10000] of ty2;
//============================
function dis(i:longint; x,y:extended):extended;
begin
  exit(sqrt(sqr(x-f[i].x)+sqr(y-f[i].y)));
end;
//============================
begin
  assign(input,'nemo9.in'); reset(input);
  assign(output,'nemo9.out'); rewrite(output);
  read(w,v,tot_t,x,y);
  read(n); ans:=0; tot:=0; now_t:=0;
  fillchar(get,sizeof(get),false);
  for i:=1 to n do read(f[i].w,f[i].x,f[i].y,f[i].p,f[i].q);
  for i:=1 to n do
  begin
    d:=max; t:=0;
    for j:=1 to n do
    if not get[j] and (f[j].w-w<-zero) and (dis(j,x,y)<d)  then
    begin
      t:=j;
      d:=dis(j,x,y);
    end;
    if t=0 then break;
    now_t:=now_t+dis(t,x,y)/v;
    if now_t-tot_t>zero then break;
    get[t]:=true;
    w:=w+f[t].w;
    ans:=ans+f[t].w;
    inc(tot);
    step[tot].t:=now_t;
    step[tot].s:=t;
    step[tot].x:=f[t].x;
    step[tot].y:=f[t].y;
    x:=f[t].x; y:=f[t].y;
  end;
  writeln(tot);
  writeln(ans:0:6);
  for i:=1 to tot do
  writeln(step[i].t:0:6,' ',step[i].x:0:6,' ',step[i].y:0:6,' ',step[i].s);
  close(input); close(output);
end.

 

 {nemo 100 Evaluate answer files.
101 10 0.000 Correct! Yours = 20.00, Best = 20.00
101 10 0.000 Correct! Yours = 73.00, Best = 73.00
101 10 0.000 Correct! Yours = 1073741823.00, Best = 1073741823.00
101 10 0.000 Correct! Yours = 25905712.00, Best = 25905712.00
101 10 0.000 Correct! Yours = 34258154.00, Best = 34258154.00
101 10 0.000 Correct! Yours = 34189691.00, Best = 34189691.00
101 10 0.000 Correct! Yours = 56452.00, Best = 56452.00
101 10 0.000 Correct! Yours = 174773389722037.00, Best = 174773389722037.00
101 10 0.000 Correct! Yours = 16667039.00, Best = 16667039.00
101 10 0.000 Correct! Yours = 22072761.00, Best = 21848713.00
}102 100

posted @ 2012-05-13 11:34  datam  阅读(1161)  评论(0编辑  收藏  举报