比赛 NOIP_5 评测结果 AATTT
题目名称 添加号 最终得分 40
用户昵称 lc 运行时间 0.000 s
代码语言 Pascal 内存使用 0.00 MiB
提交时间 2008-09-24 21:27:23
显示代码纯文本
program day5_2;
 type
  node=array[0..100] of integer;
 var
    s:string;
    m:integer;
    f:array[1..200,0..20] of node;

 procedure init;
  var
      i:integer;
 begin
  readln(s);
  read(m);
 end;

 function Suan(i,j:integer):node;
  var
     k:integer;
     tm:node;
 begin
  for k:=j downto i do
  tm[j-k+1]:=ord(s[k])-48;
  tm[0]:=j-i+1;
  Suan:=tm
 end;

 function plus(a,b:node):node;
  var
     i:integer;
     c:node;
 begin
  fillchar(c,sizeof(c),0);
  if a[0]>b[0] then c[0]:=a[0] else c[0]:=b[0];
  for i:=1 to a[0] do
  inc(c[i],a[i]);
  for i:=1 to b[0] do
  inc(c[i],b[i]);
  for i:=1 to c[0] do
   begin
   inc(c[i+1],c[i] div 10);
   c[i]:=c[i] mod 10
   end;
  while c[c[0]+1]>0 do
   begin
   inc(c[0]);
   inc(c[c[0]+1],c[c[0]] div 10);
   c[c[0]]:=c[c[0]] mod 10
   end;
  plus:=c;
 end;

 function small(a,b:node):boolean;
  var
      i:integer;
 begin
  if a[0]<b[0] then exit(true);
  if a[0]>b[0] then exit(false);
  for i:=a[0] downto 1 do
  if a[i]<b[i] then exit(true)
  else
  if a[i]>b[i] then exit(false);
  exit(false);
 end;

 procedure main;
  var
      tmp:node;
      i,j,k:integer;
 begin
  for i:=1 to length(s) do
   begin
   f[i,0,0]:=i;
   for k:=i downto 1 do
   f[i,0,i-k+1]:=ord(s[k])-48;
   end;

  for j:=1 to m do
   for i:=1 to length(s) do
   begin
    f[i,j][0]:=maxint;
    for k:=j to i-1 do
    begin
    tmp:=plus(f[k,j-1],Suan(k+1,i));
    if small(tmp,f[i,j])
    then f[i,j]:=tmp
    end;
   end;
 end;

 procedure print;
  var
      i:integer;
 begin
  for i:=f[length(s),m][0] downto 1 do
  write(f[length(s),m][i]);
  writeln;
 end;

 begin
  assign(input,'exam4.in');
  assign(output,'exam4.out');
  reset(input); rewrite(output);
  init;
  main;
  print;
  close(input); close(output);
 end.