牛客網 小馬哥的超級鹽水 (雙向列舉)

2022-08-20 14:51:14 字數 808 閱讀 5672

分析:n的最大值能達到35,有2^35種狀態,不能直接列舉所有的狀態。

但可以把n分成兩個部分,這樣每個部分的狀態列舉就能在規定時間內達到。

設i為第乙個部分的狀態,j為第二個部分的狀態。

則有(ai+aj)/(bi+bj)=x/y,進一步化為 ai*y-bi*x=bj*x-aj*y

就可以在將每個第一部分的狀態,通過二分找到第二部分中能與之匹配的狀態

**如下:

#include #include 

#include

#include

using

namespace

std;

const

int maxn=40

;typedef

long

long

ll;int

a[maxn];

intb[maxn];

intt,x,y,n,n1,n2,nowa,nowb;

ll ans;

int poi1[1000100],poi2[1000100

];int

main()

}poi1[cnt1]=nowa*y-nowb*x;

cnt1++;

}n2=n-n1;

for(int i=0;i<(1

<)

}//coutcnt2++;

}sort(poi2+1,poi2+cnt2);

for(int i=1;i)

cout

<1

<}

return0;

}

小馬哥的超級鹽水

來呀 題意 給n杯鹽水,每一杯水有a單位鹽,b單位水。給你乙個x和y,問有多少種方法能配成x比y的鹽水。因為n只有35,沒法列舉全部情況,如果n只有一般大,那麼我們可以列舉所有情況。我們可以把n分為兩部分,列舉一部分的所有情況,然後找是否能和另一部分構成解。對於 a1,b1 和 a2,b2 這兩個集...

K 小馬哥的超級鹽水 分治 暴力

時間限制 c c 5秒,其他語言10秒 空間限制 c c 131072k,其他語言262144k 64bit io format lld 小馬哥有 輸入第一行包含乙個整數每組資料第一行包含三個整數 接下來每組資料輸出一行,包含乙個整數表示非空子集的個數。示例1 1 5 1 2 1 21 2 1 21...

18華工校賽 小馬哥的超級鹽水 折半列舉

小馬哥有 n 杯鹽水,第 i 杯有 a i 單位的鹽和 b i 單位的水。小馬哥很無聊,於是他想知道有多少種這 n 杯鹽水的非空子集,倒在一起之後鹽和水的比是 frac 範圍 2 這道題比賽沒a出來,要是a了就能兩個人分900塊辣 隔了一天才突然想到,我太菜了 折半列舉過程如下 分兩個桶a,b,分別...