來呀
題意:給n杯鹽水,每一杯水有a單位鹽,b單位水。給你乙個x和y,問有多少種方法能配成x比y的鹽水。
因為n只有35,沒法列舉全部情況,如果n只有一般大,那麼我們可以列舉所有情況。
我們可以把n分為兩部分,列舉一部分的所有情況,然後找是否能和另一部分構成解。
對於(a1,b1)和(a2,b2)這兩個集合。
易得(a1+a2)/(b1+b2)=x/y。
化簡得到(y*a1-x*b1)=(x*b2-y*a2)。所以列舉前面的然後找後面的就行了。
ac**:
#include #includeview code#include
#include
using
namespace
std;
typedef
long
long
ll;struct
nodea[
105];
ll b[
1<<19
];int
main()
int p=0
; ll n1=n/2
; ll n2=n-n1;
ll m1=(1
<
ll m2=(1
<
for(int i=0;i
}b[p++]=sum;
//cout
sort(b,b+p);
ll ans=0
;
for(int i=0;i)
}ans+=upper_bound(b,b+p,sum)-lower_bound(b,b+p,sum);
}
cout
<1
<
}return0;
}
K 小馬哥的超級鹽水 分治 暴力
時間限制 c c 5秒,其他語言10秒 空間限制 c c 131072k,其他語言262144k 64bit io format lld 小馬哥有 輸入第一行包含乙個整數每組資料第一行包含三個整數 接下來每組資料輸出一行,包含乙個整數表示非空子集的個數。示例1 1 5 1 2 1 21 2 1 21...
牛客網 小馬哥的超級鹽水 (雙向列舉)
分析 n的最大值能達到35,有2 35種狀態,不能直接列舉所有的狀態。但可以把n分成兩個部分,這樣每個部分的狀態列舉就能在規定時間內達到。設i為第乙個部分的狀態,j為第二個部分的狀態。則有 ai aj bi bj x y,進一步化為 ai y bi x bj x aj y 就可以在將每個第一部分的狀...
18華工校賽 小馬哥的超級鹽水 折半列舉
小馬哥有 n 杯鹽水,第 i 杯有 a i 單位的鹽和 b i 單位的水。小馬哥很無聊,於是他想知道有多少種這 n 杯鹽水的非空子集,倒在一起之後鹽和水的比是 frac 範圍 2 這道題比賽沒a出來,要是a了就能兩個人分900塊辣 隔了一天才突然想到,我太菜了 折半列舉過程如下 分兩個桶a,b,分別...