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