bzoj 4976 寶石鑲嵌 動態規劃

2021-08-07 05:26:43 字數 946 閱讀 5728

魔法師小q擁有n個寶石,每個寶石的魔力依次為w_1,w_2,…,w_n。他想把這些寶石鑲嵌到自己的法杖上,來提公升法杖的威力。不幸的是,小q的法杖上寶石鑲嵌欄太少了,他必須扔掉k個寶石才能將剩下的寶石鑲嵌上去。法杖的威力等於鑲嵌在上面的所有寶石的魔力按位做或(or)運算的結果,請寫乙個程式幫助小q做出最佳的選擇,使得法杖的威力最大。

2<=n<=100000,1<=k<=100,k

設最大值為w,顯然若n>k+log(w)的話則一定可以取到全部1,不然的話就dp一下就好了。

#include

#include

#include

#include

#include

#include

#define inf 0x3f3f3f3f

using

namespace

std;

const

int n=100005;

int n,k,a[n],bin[20],f[155][180005];

int main()

memset(f,inf,sizeof(f));

f[0][0]=0;

bin[0]=1;

for (int i=1;i<=17;i++) bin[i]=bin[i-1]*2;

for (int i=0;ifor (int j=0;j17];j++)

if (f[i][j]1][j]=min(f[i+1][j],f[i][j]);

f[i+1][j|a[i+1]]=min(f[i+1][j|a[i+1]],f[i][j]+1);

}int ans=0;

for (int i=bin[17]-1;i>=0;i--)

if (f[n][i]<=n-k)

printf("%d",ans);

return

0;}

bzoj4976寶石鑲嵌 DP

description 魔法師小q擁有n個寶石,每個寶石的魔力依次為w 1,w 2,w n。他想把這些寶石鑲嵌到自己的法杖上,來提公升 法杖的威力。不幸的是,小q的法杖上寶石鑲嵌欄太少了,他必須扔掉k個寶石才能將剩下的寶石鑲嵌上去。法杖的 威力等於鑲嵌在上面的所有寶石的魔力按位做或 or 運算的結果...

bzoj4976 寶石鑲嵌 亂搞 dp

題目描述 從 n 個數中選出 n k 個,使得它們的二進位制或 or 最大。輸出這個值。輸入第一行包含兩個正整數 n,k 2 le n le 100000,1 le k le 100,k第二行包含 n 個整數 w 1,w 2,w n 0 le w i le 100000 分別表示每個寶石的魔力。輸出...

bzoj 4976 寶石鑲嵌(貪心 高位字首和)

傳送門biu 當n k 16時,每一位上的1都可以出現,只需要考慮每位是否有1即可。剩下的情況n最大只有115 資料範圍瞬間變得友善了 令f state 代表組合出state最少需要多少個數,跑揹包即可。然後再將f state 更新成組合出包含state這個集合的數最少需要多少個數,列舉每個狀態的子...