删除 纪中 1381 优美的暴力

Description

  Alice上化学课时又分心了,他首先画了一个3行N列的表格,然后把数字1到N填入表格的第一行,保证每个数只出现一次,另外两行他也填入数字1到N,但不限制每个数字的出现次数。
  Alice现在想删除若干列使得每一行排完序后完全一样,编程计算最少需要删除多少列。

Input

  第一行包含一个整数N(1<=N<=100000),表示表格的列数。
  接下来三行每行包含N个整数,每个数在1到N之间,而且第一行的数互不相同。

Output

  输出最少需要删除的列数。
  

Hint

【数据范围】
  40%的数据N<=100
  70%的数据N<=10000

分析

就是一个暴力,考试时想到了和正解类似的方法,但嫌麻烦,没有打。
这个正解的暴力很优美,非常玄学。
具体见程序,自行体会。

代码

var
  a,b:array[1..3,0..100010] of longint;
  c:array[1..3,0..100010] of longint;
  n:longint;
  ans:longint;
  i,j,k:longint;
  t:boolean;

begin
  readln(n);
  for i:=1 to n do
    begin
      read(j);
      a[1,j]:=a[1,j]+1;
      b[1,i]:=j;
    end;
  readln;
  for i:=1 to n do
    begin
      read(j);
      a[2,j]:=a[2,j]+1;
      b[2,i]:=j;
    end;
  readln;
  for i:=1 to n do
    begin
      read(j);
      a[3,j]:=a[3,j]+1;
      b[3,i]:=j;
    end;
  ans:=0;
  t:=true;
  while t do
    begin
      t:=false;
      for i:=1 to n do
        begin
          if b[1,i]=0
            then continue;
          if (a[2,b[1,i]]=0) or (a[3,b[1,i]]=0)
            then
              begin
                t:=true;
                ans:=ans+1;
                b[1,i]:=0;
                dec(a[2,b[2,i]]);
                dec(a[3,b[3,i]]);
                if a[2,b[2,i]]<0 then a[2,b[2,i]]:=0;
                if a[3,b[3,i]]<0 then a[3,b[3,i]]:=0;
              end;
        end;
    end;
  write(ans);
end.
posted @ 2016-07-13 20:09  一个响亮的蒟蒻  阅读(173)  评论(0编辑  收藏  举报