• Fire


    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.

  • 相关阅读:
    ER图转关系模式, 强制参与和选择参与
    panoramio
    as3中flash的静态文本是可以直接访问的
    城市战3操作很失败
    20111120杭州天地行
    XNA 实用教程
    十、样式
    十三、“自己”的动画——图片转换
    十三、“导航”的动画——页面跳转
    十三、“自己”的动画——按钮
  • 原文地址:https://www.cnblogs.com/fengxiudong/p/6017308.html
Copyright © 2020-2023  润新知