小馬哥的超級鹽水

2022-05-01 12:00:06 字數 932 閱讀 4844

來呀

題意:給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 #include 

#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;

}

view code

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,分別...