bzoj3900 交換茸角

2022-04-10 05:42:22 字數 979 閱讀 2624

題目鏈結

看到n比較小,可以狀壓。

可以先考慮什麼情況下會無法平衡。顯然就是排完序之後兩兩相鄰的不能滿足小於等於c的限制。

狀態。用f[i]來表示i集合中的鹿完成交換所需要的次數。

預處理。無法平衡的肯定就是inf。已經平衡的是0。其他的先暫設為k-1(k是i集合中鹿的個數)。

然後轉移。每個集合可以由他的子集轉移過來。即$$f[i]=min(f[i],f[j] + f[i \oplus j])$$

其中j為i的子集

/*

* @author: wxyww

* @date: 2019-01-19 14:17:57

* @last modified time: 2019-01-19 14:30:13

*/#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

const int inf = 1e9 + 7,n = 100000 + 10;

ll read()

while(c>='0'&&c<='9')

return x*f;

}int n,c,tmp[n];

int a[20],b[20],tt[100];

int pd(int x)

}if(bz == 0) return 0;

sort(tt + 1,tt + js + 1);

for(int i = 1;i <= js;i += 2)

return js / 2 - 1;

}int f[n];

int main()

for(int i = 1;i <= k;++i)

for(int i = 1;i <= k;++i)

}cout

}

bzoj3900 交換茸角

dp i 表示讓狀態為i的鹿滿足要求的最少交換次數 不能列舉兩頭鹿交換,因為一頭鹿可能交換多次後轉移到下乙個狀態 那就列舉子集 dp i min 初始化 將i這個狀態上的麋鹿的角從小到大排序後,若相鄰的i和i 1滿足 h i 1 h i c,則dp i 鹿的個數 1,否則dp i inf 因為若有t...

bzoj3900 交換茸角(狀壓DP)

神題一道,入手毫無思路 還是頭一次寫這種找下界的狀壓dp,首先,n頭路,我們的最大交換次數為n 1次 因為把所有鹿的茸角打亂重新分配的話,只需要n 1次就可按照從小到大的順序完成重排 這也是差值最小的方法,但是如果這樣都不合法的話,說明這個集合沒法重排,輸出 1 好了,那麼說說怎麼優化 對於每乙個集...

3900 交換茸角

time limit 20 sec memory limit 512 mb submit 165 solved 72 submit status discuss 動物園裡有 n 頭麋鹿。每頭麋鹿有兩支茸角,每支茸角有乙個重量。然而,一旦某頭麋鹿上 兩支茸角的重量之差過大,這頭麋鹿就會失去平衡摔倒。為...