qwb與李主席 狀壓 二分

2021-08-02 04:55:45 字數 1375 閱讀 1901

description

qwb和李主席打算平分一堆寶藏,他們想確保分配公平,可惜他們都太懶了,你能幫助他們嘛?

input

輸入包含多組測試資料,處理到檔案結束。

每組測試資料的第一行是乙個正整數n(0 <= n <=36 )表示物品的總個數.。

接下來輸入n個浮點數(最多精確到分),表示每個物品的價值v(0 < v <= 1e9)。

output

對於每組測試資料,輸出能夠使qwb和李主席各自所得到的物品的總價值之差的最小值(精確到分),每組測試資料輸出佔一行。

sample input

3 0.01 0.1 1

2 1 1

sample output

0.89

0.00

hint

首先年輕的我會想到dp,可能因為n很小 v很大,所以 揹包是不可行的,只能用二分查詢後者dfs。

對,因為是只有兩個人,所以你會想到列舉乙個,再二分sum/2-前面的是完全可行的。

因為資料範圍是 36 單純的狀壓肯定會超時。

然後我們可以想到乙個人拿東西可能全在左邊拿,或者全在右邊拿。或者既在左邊又在中間拿,對,說了和沒說是一樣的。但是這個揭露乙個關鍵點,可以把這個東西列舉一邊,二分另一邊。所以就簡單了,而且一邊進行18個進行狀壓列舉,完全可以把所有的狀態都弄出來。然後列舉一邊,再二分另一邊得到最正確的結果。

第乙個坑點,因為是浮點數,要求精度比較高,精確到兩位後會到11位,可以用long double,也可以化為 longlong 化成整型,因為後面要進行/2,所以200就很完美了。另乙個點是 求兩邊相差最小,abs(sum-2(乙個人的物品價值就好))

#include 

using

namespace

std;

typedef

long

long ll;

ll a[1

<<18],b[1

<<18],c[1

<<18],d[1

<<18];

void gao(ll g,ll h,int n)

gao(c,a,cnta);

gao(d,b,cntb);

cnta=(1

<1

<1e18;

for(int i=0;iint pos=lower_bound(a,a+cnta,sum/2-b[i])-a;

minn=min(minn,abs(sum-2*(b[i]+a[pos])));

if(pos>=1) minn=min(minn,abs(sum-2*(b[i]+a[pos-1])));

}printf("%.2f\n",minn*1.0/200 );

}}

fzu2178禮物分配 狀壓 二分

在雙胞胎兄弟eric與r.w的生日會上,他們共收到了n個禮物,生日過後他們決定分配這n個禮物 numv numw n 對於每個禮物他們倆有著各自心中的價值vi和wi,他們要求各自分到的禮物數目 numv numw 1,並且各自所衡量的禮物價值的差值 sumv sumw 盡可能小,現在他們想知道最小的...

2018 10 05 校內模擬 二分 狀壓 樹剖

t1 階乘 fact.cpp 問題描述 有 n個正整數 a i 設它們乘積為 p,你可以給 p乘上乙個正整數 q,使 p q剛好為正 整數m的階乘,求m的最小值。輸入 共兩行。第一行乙個正整數n。第二行n個正整數a i 輸出 共一行乙個正整數m。輸入樣例 16 輸出樣例 3樣例解釋 當p 6,q 1...

HDU 3681 bfs 狀壓dp 二分

題目 click 題意 給定乙個n m的地圖,d表示不能走的地方,g補充滿能量,問從f點走完所有的y點最小的能量,走乙個消耗一格能量。注意一下題目中所給的範圍,y g的數量不超過15。在無數條路徑中找出一條最佳路徑,d是不能走的,所需點的數量頂多16個 加上了f點 其實可以發現本質就是乙個tsp的變...