JZOJ2017.08.12 Cグループ


T1
タイトルの説明
Windows                ,  ,               。             :
1.              n,       n*n      ,      n   ,   n   (       0,    1),              。  0                ,1               (     ,               )。
                  i j,      i j               i   j         (      Windows        ),i  j             。       i j,          (     Windows                   )。
2.          i  j             ,         : 
(1)  i j            、         (   i  j     
 0),                                  -1(              )。                  i1 j1(  :i1<>i  (1<>j)          ,          ,       -2。                    ,              。         ,            ,             :
(2)  i  j             (   i   j      -1    -2),        ,         i j   。
(3)  i j            ,            (   i   j      1),        ,      “GAME OVER!”,    。
3.     i j          ,               ,          ,            :
(1)   i j    0(                    ),               (    n n    ,                ,        ),      。
(2)        ,               ,             ,    “YOU ARE WINNER!”,    。

入力
      mine.in。       n(n<=50),      n*n    。        ,           ,  i j, 0 0  。

しゅつりょく
      mine.out。    ,    “YOU ARE WINNER!”,    “GAME OVER!”,
             。

考え方:
      ,         。

コード:
var a:array[0..100,0..100] of longint;
    i,j,n,t:longint;

procedure print;
var i,j:longint;
begin
  for i:=1 to n do begin for j:=1 to n do write(a[i,j],' '); writeln; end;
end;
procedure sign(x,y:longint);
begin
  if a[x,y]=0 then a[x,y]:=-1 else
  if a[x,y]>-1 then begin a[x,y]:=-2; dec(t); end;
end;
begin
  assign(input,'mine.in');
  assign(output,'mine.out');
  reset(input);
  rewrite(output);
  read(n);
  for i:=1 to n do for j:=1 to n do begin read(a[i,j]); if a[i,j]=1 then inc(t); end;
  i:=1; j:=1;
  while (i<>0)and(j<>0) do
  begin
    read(i,j);
    if (i=0)and(j=0) then begin print; close(input); close(output);halt; end;
    case a[i,j] of
      0:
      begin
        a[i,j]:=-1;
        sign(i+1,j+1); sign(i+1,j); sign(i,j+1);
        sign(i+1,j-1); sign(i-1,j+1);
        sign(i-1,j-1); sign(i,j-1); sign(i-1,j);
        if t=0 then
        begin
          write('YOU ARE WINNER!');
          close(input); close(output);
          halt;
        end;
      end;
      1:
      begin
        write('GAME OVER!');
        close(input); close(output);
        halt;
      end;
    end;
  end;
  close(input); close(output);
end.

T2
タイトルの説明
          ,     ?    n   n-1            。
  2012                     (            )  ,                 。
           ,       ,   i            。             ,                    ,        1。
              ,        ,           。

入力
       tree.in,  N  。          N,        。 2     N  ,             a  b,  a  b   。

しゅつりょく
     tree.out  N  , i      i      。

考え方:
     ,  ,AC!!!

コード:
uses math;
var n,i,x,y,ans:longint;
    a:array[0..1010,0..1010] of longint;
procedure dfs(f,s,dep:longint);
var i:longint;
begin
  if (a[s,0]<1) then begin ans:=max(dep,ans); exit; end else
  if (dep>1)and(a[s,0]<=1) then begin ans:=max(dep,ans); exit; end;
  for i:=1 to a[s,0] do
    if (a[s,i]<>f) then dfs(s,a[s,i],dep+1);
end;
begin
  assign(input,'tree.in');
  assign(output,'tree.out');
  reset(input);
  rewrite(output);
  read(n);
  for i:=1 to n-1 do
  begin
    read(x,y);
    inc(a[x,0]); a[x,a[x,0]]:=y;
    inc(a[y,0]); a[y,a[y,0]]:=x;
  end;
  for i:=1 to n do begin ans:=0; dfs(0,i,1);  writeln(ans); end;
  close(input);
  close(output);
end.

タイトルの説明
     A×B×C       ,    1×1×1         。            A,  B,  C。(     ,               )。
                     (A-1)×(B-2)×(C-2)     。               n, n=(A-1)×(B-2)×(C-2)。    ,        ,           1×1×1                。    ,    n     , min{A×B×C-n} max{A×B×C-n}。

入力
       block.in。
   1 ,      n。

しゅつりょく
       block.out。
   1              ,                       。

考え方:
      max=8*n-9(    )
   min。    ,   。   min(max)

コード:
var i,j,x:longint;
    max,min,n:int64;
    a:array[0..100000]of longint;
begin
  assign(input,'block.in');
  assign(output,'block.out');
  reset(input);
  rewrite(output);
  min:=maxlongint; read(n); max:=8*n+9;
  for i:=1 to trunc(sqrt(n)) do
  if n mod i=0 then
  begin
    inc(x);
    a[x]:=i;
    if n div i<>i then
    begin
      inc(x);
      a[x]:=n div i;
    end;
  end;
  for i:=1 to x do
    for j:=1 to x do
      if(a[i]*a[j]*(n div a[i] div a[j])=n)
      and((n div a[i] div a[j]+2)*(a[i]+2)*(a[j]+1)-nthen
        min:=(n div a[i] div a[j]+2)*(a[i]+2)*(a[j]+1)-n;
  write(min,' ',max);
  close(input);
  close(output);
end.

T4
タイトルの説明
4 7        。                  。 47,477    , 5,17,417       。
  next(x)      x       。
               :
next(L)+next(L+1)+...+next(R-1)+next(R)。
     L R  ,                  。

入力
    sum.in          L R(1≤L≤R≤109 ),L R           。

しゅつりょく
    sum.out         ,       。

考え方:
       4 7,              。
           。

コード:
uses math;
var l,r,l1,r1,t:longint;
    ans:array[0..51] of int64;
    a:array[0..5001] of int64;
procedure jia(x:int64);
var i:longint;
begin
  i:=1;
  ans[i]:=ans[i]+x;
  while ans[i]>9 do
  begin
    ans[i+1]:=ans[i] div 10+ans[i+1];
    ans[i]:=ans[i] mod 10;
    inc(i);
  end;
  t:=max(i,t);
end;
procedure init;
var i,j,t:longint;
begin
  read(l,r);
  j:=0;
  for i:=2 to 2047 do
  begin
    inc(j);
    t:=i;
    while t>1 do
    begin
      case t mod 2 of
        0:a[j]:=a[j]*10+4;
        1:a[j]:=a[j]*10+7;
      end;
      t:=t div 2;
    end;
    if (l<=a[j])and(l1=0) then l1:=j;
    if (r<=a[j])and(r1=0) then r1:=j;
  end;
end;
procedure main;
var i:longint;
begin
  t:=1;
  jia((min(r,a[l1])-l+1)*a[l1]);
  for i:=l1+1 to r1-1 do jia((a[i]-a[i-1])*a[i]);
  if l1<>r1 then jia((r-max(l,a[r1-1]))*a[r1]);
  for i:=t downto 1 do write(ans[i]);
end;
begin
  assign(input,'sum.in');
  assign(output,'sum.out');
  reset(input);
  rewrite(output);
  init;
  main;
  close(input);
  close(output);
end.

T5
タイトルの説明
      :
1.    :                            (          )             。
  ,         2、 4     2、 4、 5              2*3          。
2.      :                  (      )    。
3.      :                   。

    :     n   m        ,             r   c      ,            ,       。

入力
       submatrix.in。
                n, m, r, c,     ᧿    ,              。
     n  ,      m          ,      ᧿     n   m     。

しゅつりょく
       submatrix.out。
    1  ,   1    ,      ᧿          。

問題:
           !
         dp 
f[i][j]= i   j      

コード:
var a:array[0..20,0..20]of longint;
    b,y:array[0..20]of longint;
    f:array[0..20,0..20,0..20]of longint;
    i,j,k,l,n,m,r,c,ans:longint;
procedure init;
var i,j:longint;
begin
  read(n,m,r,c);
  for i:=1 to n do for j:=1 to m do read(a[i,j]);
  ans:=maxlongint;
end;
procedure dfs(t1,t2:longint);
var tot,i,j,k,t,l,x:longint;
begin
  if (t2>n) and (t1then exit;
  if t1then
  begin
    dfs(t1,t2+1);
    inc(b[0]);
    b[b[0]]:=t2;
    dfs(t1+1,t2+1);
    b[b[0]]:=0;
    dec(b[0]);
  end else
  if t1=r then
  begin
    fillchar(f,sizeof(f),$7f);
    f[0,0,0]:=0;
    for i:=0 to m-1 do
    begin
      for j:=i+1 to m do
      begin
        if j>=c then t:=c else t:=j;
        if i=0 then t:=1;
        for k:=1 to t do
        begin
          f[i,j,k]:=0;
          x:=maxlongint;
          for l:=0 to i-1 do if f[l,i,k-1]then x:=f[l,i,k-1];
          f[i,j,k]:=x;
          if i-1<0 then f[i,j,k]:=0;
          if (f[i,j,k]>ans) or (f[i,j,k]>512000) then continue;
          if k=1 then
          begin
            for l:=2 to r do
            f[i,j,k]:=f[i,j,k]+abs(a[b[l-1],j]-a[b[l],j]);
          end else
          begin
            for l:=1 to r do
              f[i,j,k]:=f[i,j,k]+abs(a[b[l],i]-a[b[l],j]);
            for l:=2 to r do
              f[i,j,k]:=f[i,j,k]+abs(a[b[l-1],j]-a[b[l],j]);
          end;
          if (k=c) and (f[i,j,k]then ans:=f[i,j,k];
        end;
      end;
    end;
  end;
end;
begin
    assign(input,'submatrix.in');
    assign(output,'submatrix.out');
    reset(input);
    rewrite(output);
    init;
    dfs(0,1);
    write(ans);
    close(input); close(output);
end.