問題 U 排序 奶牛的編號

2021-10-08 07:54:02 字數 2095 閱讀 6548

時間限制: 1 sec 記憶體限制: 64 mb

題目描述

有n(1≤n≤1000)頭奶牛,它們都被標上乙個優先等級編號:1,2或3。用來表示它們喝水時的優先次序,編號為l的最優先,編號為2的其次,編號為3的最後。每天奶牛開始時排成一行,但總是很亂,需要你把它們重新排成編號為1的奶牛在最前面,編號為2的其次,編號為3的奶牛在最後。你能計算出最少需要多少的交換次序來完成這次重排嗎?

輸入第1行:1個整數n;

第2至n+i行:第i+l行有乙個整數表示開始佇列中第i頭奶牛的編號。

輸出1行,只乙個整數,表示最少需要交換次數。

樣例輸入 copy92

2133

3231

樣例輸出4提示

樣例說明:有一種交換方法。

222

<11

2<11

111<22

2233

<22

2333

3<23

3333

22<33

3333

3311

1<

2<

3

俺也沒看懂樣例的解釋,這是個啥嗎?

題目大意:

給出打亂順序的只含有1,2,3的序列,求按照1>2>3的順序排好要交換幾次。

思路:

假設有乙個已經排好序的序列,那麼1,2,3一定都有固定的區間,不妨設1出現在[1,

n1

][1,n1]

[1,n1]

,2出現在[n1

+1,n

1+n2

][n1+1,n1+n2]

[n1+1,

n1+n

2],3出現在[n1

+n2+

1,n]

[n1+n2+1,n]

[n1+n2

+1,n

],其中1,2,3的數量為n1,

n2,n

3n1,n2,n3

n1,n2,

n3。之後要進行最少的交換次數,首先從第乙個區間裡尋找2,3的位置並用記錄;再從第二個區間尋找1,每找到乙個就與第乙個區間裡的非1數字交換,如果遇到3,繼續記錄位置,這個過程中會把區間1中的3交換的區間2(如果區間1有3的話);最後處理區間3,遇到非3數字就進行交換。最後得到的結果是最優的。

#include

#include

//#define local

using

namespace std;

typedef

unsigned

long

long ull;

typedef

long

long ll;

const

int n =

1005

;const

int inf =

0x3f3f3f3f

;const

int mod =

1e8+7;

int n;

int a[n]

;int n1,n2,n3;

intmain()

int ans=0;

int pos1[n]

=,pos2[n]=;

int k=

0,l=0;

for(

int i=

1;i<=n1;i++

)for

(int i=n1+

1;i<=n1+n2;i++

)else

if(l>=1)

}if(a[i]==3

) pos2[l++

]=i;

}for

(int i=n1+n2+

1;i<=n;i++

)else

if(l>=1)

}if(a[i]==2

&&l>=1)

}printf

("%d"

,ans)

;return0;

}

奶牛的編號

題目 題目描述 有n 1 n 1000 頭奶牛,它們都被標上乙個優先等級編號 1,2或3。用來表示它們喝水時的優先次序,編號為l的最優先,編號為2的其次,編號為3的最後。每天奶牛開始時排成一行,但總是很亂,需要你把它們重新排成編號為1的奶牛在最前面,編號為2的其次,編號為3的奶牛在最後。你能計算出最...

奶牛的編號 UPCOJ 3578

題目描述 有n 1 n 1000 頭奶牛,它們都被標上乙個優先等級編號 1,2或3。用來表示它們喝水時的優先次序,編號為l的最優先,編號為2的其次,編號為3的最後。每天奶牛開始時排成一行,但總是很亂,需要你把它們重新排成編號為1的奶牛在最前面,編號為2的其次,編號為3的奶牛在最後。你能計算出最少需要...

U108258 牛的編號 加強版)

題目 u108258 牛的編號 加強版 題解 先建一顆二叉樹,每個節點的值是這段區間的長度大小。然後從最後乙個,比如最後乙個是a i 因為比ans i 小的個數是a i 個,那麼ans i 應該就是第a i 1個,所以直接在1 n尋找沒有填充的第a i 1個 includeusing namespa...