NOIP2013模擬 粉刷匠

2021-07-12 05:17:43 字數 1064 閱讀 5085

給出n個球,其中有c1個球是顏色1的,有c2個球是顏色2的,有c3個球是顏色3的……

有ck個球是顏色k的。求相鄰兩個球顏色不同的排列方案。

k<=15,ci<=6,資料組數<=2000

這種題一般很難有直接的通式,可以考慮dp。

設fi,j表示,前i中顏色已經放完了,其中產生了j個不合法的空的方案數。(這裡的空指的是每兩個球中間的位置,包括開頭結尾,不合法即指兩邊的球的顏色相同)

我們再列舉乙個p和q,表示這種顏色要放到p個合法空和q個不合法空。

那麼新的j呢?

因為我們放入了q個不合法空,所以j會減去q,然後,總共有c[i+1]個球,在p+q個空中各放了乙個後,剩下的無論怎麼放都會產生乙個不合法空,所以加上c[i+1]-p-q

即:f[i,j]->f[i+1,j+c[i+1]-p-q]

然後如何轉移,首先,我們要把c[i+1]個球放到p+q個空中,每個空都必須要放,所以有cp

+q−1

c[i+

1]−1

種方法放,然後,在現有的j個空中選q個,乘上cq

j ,設總共有sum個空,再乘上cp

sum−

j 。

然後這道題就解決了。

ps:由於比賽時特別方,我瘋狂滴優化常數,打得非常的渣渣。

#include

#include

#include

#define fo(i,a,b) for(int i=a;i<=b;i++)

#define mo 1000000007

#define n 105

using namespace std;

typedef long long ll;

int n,ty,x,c[n][n],f[20][n];

int min(int

x,int

y) int get()

int main()

} for(ty=get();ty;ty--) sum+=x;

}printf("%d\n",f[n][0]);

}}

模擬 NOIP 2013 花匠

花匠棟棟種了一排花,每株花都有自己的高度。花兒越長越大,也越來越擠。棟棟決定把這排中的一部分花移走,將剩下的留在原地,使得剩下的花能有空間長大,同時,棟棟希望剩下的花排列得比較別緻。具體而言,棟棟的花的高度可以看成一列整數h 1,h 2,h n。設當一部分花被移走後,剩下的花的高度依次為g 1,g ...

NOI(P)2013模擬 秘密任務

這題是在最短路上研究問題的,所以理所當然要建個圖先。其次我們先考慮費用,看看這圖,再yy一下,那麼我們可以發現這就是典型的最小割問題,可是我們還是要考慮如何判斷這個割是否唯一。首先,大家可以先去看我的另乙個blog,上面有寫類似這樣的判斷最大流是否唯一。其實這兩題是不同的。所以我在考試時就掛了。因為...

jzoj3424 NOIP2013模擬 粉刷匠

description input 第一行乙個正整數t,表示測試資料組數 對於每一組測試資料資料 第1行 乙個正整數k 第2行 k個正整數,表示第i桶油漆可以粉刷的石柱個數,ci。output 對於每組輸入資料,輸出一行乙個整數,表示粉刷的方案數mod 1000000007。sample input...