[BZOJ1106] [POI2007]立方体大作战tet

本文针对一个特定算法问题展开讨论:给定一个包含重复元素的序列,通过交换相邻元素的方式将相同的数字配对并消除,旨在寻找实现这一目标所需的最少操作步骤。文章详细介绍了使用栈来跟踪配对情况的方法,并通过实例解释了如何计算最小交换次数。

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

传送门

http://www.lydsy.com/JudgeOnline/problem.php?id=1106

题目大意

给定一个长度为2n的序列,1~n各出现两次,可以交换相邻两项,两个同样的数放在一起会对消,求把所有数对消的最小交换次数

题解

如果一对在另一对内部,那么先消掉它,所以我们用一个栈存,如果这个数在栈中,那么把他们内部的部分向前移即可
由于ans不超过1000000所以暴力即可

var
 x,t:array[0..50005]of longint;
 i,j,k:longint;
 n,ans:longint;
procedure swap(var a,b:longint);
var c:longint;
begin
 c:=a; a:=b; b:=c;
end;

begin
 readln(n); ans:=0;
 fillchar(x,sizeof(x),0); t[0]:=0;
 for i:=1 to 2*n do
  begin
   inc(t[0]); readln(t[t[0]]);
   if x[t[t[0]]]=0
   then x[t[t[0]]]:=1
   else begin
    for j:=t[0]-1 downto 1 do
     if t[j]=t[t[0]] then break;
    inc(ans,t[0]-j-1);
    for k:=j to t[0]-1 do
     t[k]:=t[k+1];
    dec(t[0],2);
   end;
  end;
 writeln(ans);
end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值