比赛 20120711 评测结果 AAAAAATTATTT
题目名称 平衡奶牛 最终得分 58
用户昵称 isabella 运行时间 5.012 s
代码语言 Pascal 内存使用 11.61 MiB
提交时间 2012-07-11 11:50:51
显示代码纯文本
type arr=array[1..30]of longint;
var
 n,k,i,j,t,delt,min,max,ans:longint;
 a:array[1..100000]of arr;
 tot:arr;

procedure dfs(s,len:longint;b:arr;delt:longint);
 var i,min,max:longint;
     tt:arr;
 begin
  if delt=0 then begin ans:=len;exit;end;

  if len-delt<=ans then exit;
  tt:=b;
  min:=maxlongint;max:=0;
  for i:=1 to k do
   begin
    for j:=s to s+delt-1 do b[i]:=b[i]-a[j,i];
    if b[i]<min then min:=b[i];
    if b[i]>max then max:=b[i];
   end;
  dfs(s+delt,len-delt,b,max-min);

  min:=maxlongint;max:=0;
  for i:=1 to k do
   begin
    for j:=s+len-delt to s+len-1 do tt[i]:=tt[i]-a[j,i];
    if tt[i]<min then min:=tt[i];
    if tt[i]>max then max:=tt[i];
   end;
  dfs(s,len-delt,tt,max-min);
 end;

begin
assign(input,'balline.in');reset(input);
assign(output,'balline.out');rewrite(output);
{init}
 readln(n,k);
 for i:=1 to n do
  begin
   readln(j);
   t:=0;
   while j<>0 do
    begin inc(t);a[i,t]:=j mod 2;
      j:=j div 2;
      tot[t]:=tot[t]+a[i,t];
    end;
  end;
{work}
 min:=maxlongint;max:=0;
 for i:=1 to k do
  begin
   if tot[i]<min then min:=tot[i];
   if tot[i]>max then max:=tot[i];
  end;
 delt:=max-min;
 ans:=0;
 dfs(1,n,tot,delt);

 writeln(ans);
 {for i:=1 to n do
  begin for j:=1 to k do write(a[i,j],' ');
  writeln;end;}
close(input);close(output);
end.