時間限制: 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...