【DP】地震了!(earthquake)

 

地震了!(earthquake)

模拟赛背景:2008年5月12日14点28分,绵州大地突然狂烈地咆哮起来。风在此刻为之战栗,光在此刻也为之伫足。饱经沧桑的绵阳城在此刻疯狂地哭泣。房屋开始倒塌,尖叫声不绝于耳,汽车在大街上发生强烈的碰撞。一切都开始疯狂起来,只能依稀看见火车客站的钟楼上永远停伫的14点28分……

  (以上内容与考试无关,请各位OIERS不要介意……)

 

地震了!绵中人民从N层高的教学楼上如潮水般涌了下来。班帅JDC不幸在这幢教学楼最高层。每一层都不停有人流涌出。当然了,不同楼层的人因为年级不同涌下来的速度也不同。而班帅JDC只有不比那一层的人跑得慢才能保证他不被踩死。但是JDC跑得比他们快很了也不行,速度之差最多不能大于K。因为这样的话JDC会踩死很多人,就会因RP暴降而死。JDC每下一层楼,可以选择将他的速度加快一个单位或者减慢一个单位或者保持原来的速度不变。

房子会在一会儿后倒塌。要求是,JDC一定要下楼,并且他下每一层的速度之和除以(N-1)要尽量大。当然跑下楼时他一定要活着。现在JDC已经被吓傻了,请你编个程序帮帮他吧!

提示:1楼不需要再下了,N层楼只需要下N-1层。并且在第N层楼到N-1层时必须为初始速度。

 

输入格式

第一行,三个整数N,V(初始速度),K(最多比其他人快的速度值)

第二行,N-1个整数,分别代表从第二层到第N层的人的速度

其中2〈=N〈=100,0〈=K〈=100,1〈=V〈=100。  每一层其他人速度同V的范围。

 

输出格式

若能下楼,输出速度之和除以(N-1),保留两位小数。

若不能,给涛哥发个短信吧,输出“YI DING YAO JIAN CHI JI HUA SHENG YU”(不含引号)

输入样例1

  3 3 2

  2 2

输出样例1

  3.50 

输入样例2

  3 3 0

  2 2

输出样例2

  YI DING YAO JIAN CHI JI HUA SHENG YU

 

样例解释

  样例一:3楼到2楼,速度为初始的3

          2楼到1楼,速度加快,为4

          输出(3+4)/2=3.50

  样例二:3楼到2楼,速度为初始的3,3-2>0,人品暴降而死。

======================

===============================

var
  n,v,k:longint;
  f:array[1..100,0..201]of longint;
  f_bo:array[1..100,0..201]of boolean;
  vi:array[1..100]of longint;
  
procedure init;
begin
  assign(input,'earthquake.in');
  assign(output,'earthquake.out');
  reset(input); rewrite(output);
end;

procedure terminate;
begin
  close(input); close(output);
  halt;
end;

function max(a,b:longint):longint;
begin
  if a>b then exit(a);
  exit(b);
end;

procedure main;
var
  i,j:longint;
  ans:longint;
begin
  readln(n,v,k);
  for i:=1 to n-1 do read(vi[i]);
  for i:=1 to n do
    for j:=0 to 201 do
      f[i,j]:=-maxlongint;
      
  if abs(vi[n-1]-v)>k then
    begin
      writeln('YI DING YAO JIAN CHI JI HUA SHENG YU');
      terminate;
    end;
    
  if n=2 then
    begin
      writeln(v*1.0:0:2);
      terminate;
    end;
    
  fillchar(f_bo,sizeof(f_bo),false);
  f[n-1,v]:=v;
  f_bo[n-1,v]:=true;
  for i:=n-2 downto 1 do
    for j:=1 to 201 do
      if f_bo[i+1,j]=true then
        begin
          if (j-vi[i]<=k)and (j-vi[i]>=0) then
            begin
              f[i,j]:=max(f[i,j],f[i+1,j]+j);
              f_bo[i,j]:=true;
            end;
          if (0<=(j+1-vi[i]))and((j+1-vi[i])<=k) then
            begin
              f[i,j+1]:=max(f[i,j+1],f[i+1,j]+j+1);
              f_bo[i,j+1]:=true;
            end;
          if (j-1-vi[i]>=0)and((j-1-vi[i])<=k) then
            begin
              f[i,j-1]:=max(f[i,j-1],f[i+1,j]+j-1);
              f_bo[i,j-1]:=true;
            end;
        end;
  ans:=-maxlongint;
  for j:=1 to 201 do
    if f[1,j]>ans then ans:=f[1,j];
  if ans=-maxlongint then
    begin
      writeln('YI DING YAO JIAN CHI JI HUA SHENG YU');
      terminate;
    end;
  writeln(ans/(n-1):0:2);
end;

begin
  init;
  main;
  terminate;
end.


 

你可能感兴趣的:(NOIP2011黎明前夕的黑暗,动态规划)