牛客小白月賽23 奇怪的揹包問題增加了(思維)

2021-10-05 02:06:33 字數 1471 閱讀 9908

題意:有230 揹包容量,有n個物品,每個物品體積ci=2k,求是否能恰好裝滿揹包。

第一行,是乙個正整數t(1 \le t \le 100000)t(1≤t≤100000),表示接下來要輸入t組測試資料

接下來有t測試資料的輸入,對於每組測試資料,輸入格式如下:

第一行,乙個整數m(1 \le m \le 100000, \sum m\le10^5)m(1≤m≤100000,∑m≤10 5)第二行,用空格隔開的m個非負整數,第i個數字是k_i (0 \le k_i < 30)k

i (0≤k i<30)

依次輸出t行,按照輸入資料的順序依次給出每組測試資料的答案,對於一組測試資料:如果存在一種符合條件的方案,則輸出乙個長度為m的01串,從前往後的第i位如果是1表示原序列中第i個物品被選中裝進揹包,為0則表示這個物品不被選中。如果不存在符合條件的方案,請輸出impossible

輸入24

29 1 28 28

70 0 1 2 3 4 15

輸出1011

impossible

我們要注意到這是二進位制加法,即230== 229+229 == 229+228+228 == 228+228+228+228 ,我們可以發現二進位制加法有乙個特點,它不會一下子越過乙個數,它是逐步上公升的。例如:期望值:100(2),目標值:1000(2),不論我們以哪種加法到達1000(2),都需要經過期望值。在此題我們的期望值是230,目標值是揹包物品的和,當且僅當目標值》=期望值有解。因此我們可以把物品ci按降序排列,能放的就放,若有解一定能找到揹包恰好放滿的解。

#include

using

namespace std;

typedef

long

long ll;

const

int maxn=

1e5+5;

struct node

;node a[maxn]

;inline

intcmp

(node a,node b)

int ans[maxn]

;int

main()

sort

(a+1

,a+1

+n,cmp)

; ll sum=

1<<30;

memset

(ans,0,

sizeof

(ans));

for(

int i=

1;i<=n;i++)}

if(sum==0)

cout<<

"\n";}

else

cout<<

"impossible"

<}return0;

}

牛客小白月賽23 B 階乘

給定乙個正整數 p 求乙個最小的正整數 n,使得 n 是 p 的倍數 第一行輸入乙個正整數t表示測試資料組數 接下來t行,每行乙個正整數p 輸出t行,對於每組測試資料輸出滿足條件的最小的n 412 48124 4這題要用到質因數分解,題解用了二分,其實用不用無所謂,首先,我們知道階乘是幾個數的乘積,...

牛客小白月賽23 B 階乘

b.階乘 思路 其實就是把p質因數分解,然後對於每乙個質因數x,去二分出來最小的乙個n 含有x的個數大於等於p中的x的個數 對於每個二分的結果取最大值 include using namespace std typedef long long ll define me a,x memset a,x,...

牛客小白月賽23 樹上求和(思維)

有一棵包含n個節點和n 1條邊的樹,規定樹鏈 u,v 為樹上從u到v的簡單路徑。樹的每條邊上都有乙個正整數,這個正整數被稱作這條邊的顏色,規定一條樹鏈的權值w u,v 為這條樹鏈上所有邊的顏色的代數和。而整棵樹的權值為所有不同的樹鏈的權值的代數和。已知所有邊的顏色集合恰好為1到n 1這n 1個不同的...