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的變...