删除 (Standard IO)

解决一个有趣的算法问题:Alice在化学课上设计了一个涉及三行N列数字表格的挑战,目标是最少删除多少列使剩余的列在每行中排序后相同。通过统计数字频率并运用快速排序算法进行优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意/Description:

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

 

读入/Input

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

 

输出/Output

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

 

题解/solution

       读入时,求出每一行数字的个数。然后枚举每一列,只要第一行的数在第二第三行没有出现,就删除。累加ans。

 

代码/Code

 

var
  n,m,ans:longint;
  a,d:array [0..100001,1..3] of longint;
  f:array [0..100001] of longint;
  v:array [0..100001] of boolean;
function fd(o:longint):boolean;
begin
  exit((d[o,1]>d[o,2]) or (d[o,1]>d[o,3]));
end;

procedure qsort(l,r:longint);
var
  i,j,mid:longint;
  t:array [1..3] of longint;
begin
  i:=l; j:=r;
  mid:=a[(l+r) div 2,1];
  repeat
    while a[i,1]<mid do inc(i);
    while a[j,1]>mid do dec(j);
    if i<=j then
      begin
        t:=a[i]; a[i]:=a[j]; a[j]:=t;
        inc(i); dec(j);
      end;
  until i>j;
  if l<j then qsort(l,j);
  if i<r then qsort(i,r);
end;

procedure init;
var
  i,j:longint;
begin
  readln(n);
  for i:=1 to 3 do
    for j:=1 to n do
      begin
        read(a[j,i]);
        inc(d[a[j,i],i]);
      end;
  qsort(1,n);
  ans:=0;
end;

procedure main;
var
  i,ta,he,t,k:longint;
begin
  ta:=0; he:=0;
  for i:=1 to n do
    if fd(i) then
      begin
        inc(ta); f[ta]:=i;
        v[i]:=true;
      end;
  while he<ta do
    begin
      inc(he); t:=f[he];
      if fd(t) then
        begin
          for i:=1 to 3 do
            begin
              k:=a[t,i];
              dec(d[k,i]);
              if (not v[k]) and (fd(k)) then
                begin
                  inc(ta); f[ta]:=k;
                  v[k]:=true;
                end;
            end;
          inc(ans);
        end;
      v[t]:=false;
    end;
end;

begin
  init;
  main;
  writeln(ans);
end.



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值