Fire

分析:

  首先,明确题意:b1,b2,……,bn 交换为b2,……,bn,b1,但这并不是意味着只能从b1开始交换,(这点从样例中可以看出),并且也不意味着交换的必须是连续的一串,可以是几个单点,如: 原序列:1 2 3 4 5,交换(1 3 5)后

         新序列:3 2 5 4 1

交换时必须按照环的方式顺时针或逆时针转动,这并没有限制,只需要一个位置移动到另一个位置时将他顶替掉,他去找他自己应该到的位置就好了,最终是按一个环的移动方式移动,但不一定是从左到右或从右到左,方向交叉。

所以:

  我们首先得到目标序列1  2  5  4  3

  然后与原序列比较    1  2  3  4  5

  做差:              0  0  2  0  -2

  1,2,4的差值一样,另外,因为原序列的有序性,无论如何转动目标序列或原序列,1,2,4的差值也一定相同,所以,差值相同的数目一定不变。那么差值相同意味着什么呢,由例子可以看出,差值为零,则该序列与原序列状态相同,所以,我们把差值相同个数最多的移动为零,则剩下的进行交换,所花费的代价一定最小(整体移动一个序列不花费代价,因为整体移动时符合题意,并且没有交换) 。

 

做法:

 

  按照题意得到目标序列,若得不到原序列则输出 -1;

得到目标序列以后与原序列比较,做差,找到差值相同数目最多的个数S,然后用总数减去S,即为所要花费的最小代价。另外,有与序列方向不确定,所以我们要将原序列倒过来,再按照此做法做一遍。两次取最小值便是答案。

 

 

代码实现:   

program exam;

var

  i,j,kl,kr,m,n,sum,max,min,ans:longint;

  a:array[1..50000] of longint;

  b:array[0..50000] of longint;

  t:array[0..50000] of longint;

  l,r:array[1..50000] of longint;

begin

  assign(input,'1.txt');

  reset(input);

  readln(n);

  for i:=1 to n do

    readln(l[i],r[i]);

  a[1]:=1;

  a[2]:=r[1];

  sum:=2;

  for i:=1 to n do

  begin

    kl:=l[a[sum]];

    kr:=r[a[sum]];

    if a[sum-1]=kl then

    begin

      inc(sum);

      a[sum]:=kr;

    end;

    if a[sum-1]=kr then

    begin

      inc(sum);

      a[sum]:=kl;

    end;

    if (a[sum]<>kl) and (a[sum]<>kr) then

    begin

      writeln('-1');

      halt;

    end;

    if sum=n then

      break;

  end;

  for i:=1 to n do

  begin

    b[i]:=a[i]-i;

    if b[i]<0 then

      b[i]:=b[i]+n;

  end;

  max:=0;

  for i:=1 to n do

  begin

    inc(t[b[i]]);

    if t[b[i]]>max then

      max:=t[b[i]];

  end;

  ans:=n-max;

  fillchar(b,sizeof(b),0);

  fillchar(t,sizeof(t),0);

  max:=0;

  for i:=1 to n do

  begin

    b[i]:=a[i]-(n-i+1);

    if b[i]<0 then

      b[i]:=b[i]+n;

  end;

  for i:=1 to n do

  begin

    inc(t[b[i]]);

    if t[b[i]]>max then

      max:=t[b[i]];

  end;

  min:=n-max;

  if min<ans then

    ans:=min;

  writeln(ans);

  close(input);

end.

span><�6  0]X�NMsoNormal>begin

 

  ans:=maxlongint;

  readln(n);

  for i:=1 to n do

    readln(a[i]);

  tmp:=a;

  qsort(1,n);

  c:=a;

  a:=tmp;

  dp;

  writeln(ans);

end.

posted on 2016-10-31 20:47  冯秀栋  阅读(154)  评论(0编辑  收藏  举报