记录编号 1327 评测结果 AAAAAAAAAA
题目名称 [IOI 1994] 数塔 最终得分 100
用户昵称 GravatarOo湼鞶oO 是否通过 通过
代码语言 Pascal 运行时间 10.000 s
提交时间 2008-09-01 21:00:31 内存使用 0.00 MiB
显示代码纯文本
{*******************************************}
{* Program Name: Shuta                     *}
{* Input File: shuta.in                    *}
{* Output File: shuta.out                  *}
{* Date: 2008.7.24                         *}
{* Programmer: Peng Bo                     *}
{*******************************************}
program shuta;
type
  jl=record                                    {用来存放数塔中的每一个节点中的数据}
    y,z:longint;                               {y,数塔节点中自身的数;z,数塔从头到当前节点的最小路经值}
    x:byte;                                    {数塔到当前节点最小路径的上一个节点的位置}
    end;
  sz=array[1..80,1..80]of jl;                  {存放数塔}
var
  s:sz;                                        {存放数塔}
  n:byte;                                      {数塔的层数}
{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
procedure input;                               {读入过程}
var
  j,k:byte;                                    {循环控制变量}
  f:text;                                      {文件变量}
begin
  assign(f,'shuta.in');                        {定义文件}
  reset(f);                                    {打开文件为读取}
  readln(f,n);
  for j:=1 to n do
    for k:=1 to j do
      read(f,s[j,k].y);                        {读取数塔中的数}
  close(f);                                    {关闭文件}

  for j:=1 to n do
    s[n,j].z:=s[n,j].y;                        {初始化数塔底层数据}
end;
{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
procedure output;                              {输出过程}
var
  f:text;                                      {文件变量}
  t,i:byte;                                    {t,存放下一个需要数出的值的位置,i,循环控制变量}
begin
  t:=1;                                        {初始化t}
  assign(f,'shuta.out');                       {定义文件}
  rewrite(f);                                  {打开文件为写入}
  writeln(f,s[1,1].z);                         {输出所选路径的值}
  write(f,s[1,1].y,' ');                       {输出路径的开头}
  for i:=1 to (n-1) do
  begin
    write(f,s[i+1,s[i,t].x].y,' ');            {输出路径}
    t:=s[i,t].x;                               {将t赋值为下一个需要数出的数的路径}
  end;
  close(f);                                    {关闭文件}
end;
{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
procedure main;                                {主要过程,计算最优路径}
var
  j,k:byte;                                    {循环控制变量}
begin
  for j:=(n-1) downto 1 do                     {自下而上处理数塔}
    for k:= 1 to j do
      if s[j+1,k].z>s[j+1,k+1].z               {寻找最优路径}
      then
      begin
        s[j,k].z:=s[j,k].y+s[j+1,k].z;         {计算到当前节点的最优路径和}
        s[j,k].x:=k;                           {纪录到当前节点最小路径的上一个节点的位置}
      end
      else
      begin
        s[j,k].z:=s[j,k].y+s[j+1,k+1].z;       {计算到当前节点的最优路径和}
        s[j,k].x:=k+1;                         {纪录到当前节点最小路径的上一个节点的位置}
      end;
end;
{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
begin
  input;                                       {读入}
  main;                                        {计算}
  output;                                      {输出}
end.