cv1106 篝火晚會(置換 找規律?)

2021-08-15 08:56:22 字數 1852 閱讀 6856

題目鏈結

分析:結論:初始序列變成目標序列的最小代價就是與目標序列上對應位置的數不同的個數

這道題的重點就在於證明:

把乙個不在應在位置上的數連一條有向邊指向它應該去的位置,這樣最終會形成環

只要按照環的順序取(b

1,b2

,...

,bm−

1,bm

) (b1

,b2,

...,

bm−1

,bm)

,就可以使環中的元素全部歸位,代價就是環中元素的個數

這樣整個序列就可以分成若干個環,每個數只有可能存在於乙個環中:不然的話某個元素可能要去多個位置,或者某個位置有多個元素要去

所以代價就是不在應在位置上的數的個數

上述的分析就是輪換的基本應用

我們暴力構造出乙個可行的目標序列後,需要計算不在應在位置上的數的個數

我們就需要逐位比對,但是整個序列會產生

n n

個起點,而每個點又有

2' role="presentation" style="position: relative;">2

2個方向選擇,一共就有2∗

n 2∗n

種狀態,暴力判斷不可行

但是有乙個規律:

起始序列固定(遞增)

任取乙個目標序列,對於每一位求乙個差值(負數則加上n)

可以發現無論如何選擇目標序列(同向)

目標序列中差值相等的位的相對位置總是固定的

差值的相等的位始終相同是由於原序列是個等差序列,所以在移動時差值要麼同時增加要麼同時減小

那麼一定存在乙個序列使這些差值相同的點與原序列的差值同時變為0

所以我們只需要隨意求出乙個目標序列

分別與正向,反向的起始序列做差,統計相同差值的數的個數,從中取ma

x max

那麼這個ma

x max

就是最多在應在位置上的數的個數 an

s=n−

max ans

=n−m

ax

#include

#include

#include

using

namespace

std;

const

int n=50005;

const

int inf=1e9;

int n,nxt[n][2],a[n];

int cnt[n];

int main()

}if (a[n]!=nxt[1][1]) ff=0;

if (!ff)

int mx=0;

for (int i=1;i<=n;i++) //正向

for (int i=0;i<=n;i++) mx=max(mx,cnt[i]),cnt[i]=0;

for (int i=1;i<=n;i++) //反向

for (int i=0;i<=n;i++) mx=max(mx,cnt[i]);

printf("%d",n-mx);

return

0;}

RQNOJ 篝火晚會

題目描述 佳佳剛進高中,在軍訓的時候,由於佳佳吃苦耐勞,很快得到了教官的賞識,成為了 小教官 在軍訓結束的那天晚上,佳佳被命令組織同學們進行篝火晚會。一共有n個同學,編號從1到n。一開始,同學們按照1,2,n的順序坐成一圈,而實際上每個人都有兩個最希望相鄰的同學。如何下命令調整同學的次序,形成新的乙...

不懂 篝火晚會

題目描述 佳佳剛進高中,在軍訓的時候,由於佳佳吃苦耐勞,很快得到了教官的賞識,成為了 小教官 在軍訓結束的那天晚上,佳佳被命令組織同學們進行篝火晚會。一共有 n 個同學,編號從 1 到 n 一開始,同學們按照 1 2 n 的順序坐成一圈,而實際上每個人都有兩個最希望相鄰的同學。如何下命令調整同學的次...

NOIP2005 篝火晚會

題目 分析 置換群.首先理解題意 b1,b2,bn是無限制的,並非連續,並非遞增,隨便選。於是可以形成若干個環,乙個環的花費是這個環包含的元素個數。所以,最小花費就是多少個人不在應在的位置上。再,多少個人不在應在的位置上 n 最多多少人在應在的位置上。然後,這個可以用偏移量求,求偏移量中包含元素最多...