折半列舉0 5

2021-09-30 16:00:40 字數 1744 閱讀 2096

0.5table of contents

折半列舉

常見型別

具體題目

poj2785

poj3977

noip2014模擬賽-某種密碼(password)

#include #include #include #include #include #include #define l long long

#define n 4003

using namespace std;

int n;

l a[n],b[n],c[n],d[n],f[n*n+3];

l read()

while(t1<='9'&&t1>='0')

return t*f;

}int main()

for(int i=1;i<=n;i++)

for(int j=1;j<=n;j++)

f[(i-1)*n+j]=c[i]+d[j];

sort(f+1,f+1+n*n);

l ans=0;

for(int i=1;i<=n;i++)

for(int j=1;j<=n;j++)

cout<#include #include #include #include #include #include #define l long long

using namespace std;

int n;

l a[40];

mapm;

map::iterator it;

l as(l x)

l read()

while(t1<='9'&&t1>='0')

return t*f;

}int main()

ans=min(ans,make_pair(as(sum),co));

if(m[sum]) m[sum]=min(m[sum],co);

else m[sum]=co;

} for(int i=1;i<1<<(n-n/2);i++)

ans=min(ans,make_pair(as(sum),co));

it=m.lower_bound(-sum);

if(it!=m.end()) ans=min(ans,make_pair(as(sum+it->first), co+it->second));

if(it!=m.begin())//這兩個順序一定不能反,wa了好久orz

} cout《關於某種密碼有如下描述:某種密碼的原文a是由n個數字組成,而密文b是乙個長度為n的01數串,原文和密文的關聯在於乙個鑰匙碼key。若key=∑〖ai*bi〗,則密文就是原文的一組合法密碼。

現在有原文和鑰匙碼,請編乙個程式來幫助他統計到底有多少個符合條件的密文。

#include #include #include #include #include #include #include #define l long long

using namespace std;

l n,key,a[43];

mapm;

l read()

while(t1<='9'&&t1>='0')

return t*f;

}int main()

for(int i=0;i<1<<(n-n/2);i++)

printf("%i64d\n",ans);

return 0;

}

折半列舉(雙向搜尋)

各有n個整數的四個數列a b c d。要從每個數列中各取乙個數,使四個數的和為0。求出這樣組合的個數。輸入n 6 a b c d 從4個數列中選擇共有n4種情況,全部判斷一遍不可行。不過將它們對半分成ab和cd再考慮,就可以快速解決了。從2個數列中選擇的話只有n2種組合,所以可以進行列舉。先從a b...

問題 A 賭徒 折半列舉查詢

題目描述 有n個賭徒打算賭一局。規則是 每人下乙個賭注,賭注為非負整數,且任意兩個賭注都不相同。勝者為賭注恰好是其餘任意三個人的賭注之和的那個人。如果有多個勝者,我們取賭注最大的那個為最終勝者。例如,a,b,c,d,e分別下賭注為2 3 5 7 12,最終勝者是e,因為12 2 3 7。輸入輸入包含...

POJ2549 Sumsets 折半列舉

題目大意是,乙個集合中有n個元素,找出最大的s,滿足條件a b c s,並且這四個數都屬於該集合,n不超過1000.如果直接列舉o n 4 顯然複雜度太高,將等式轉化一下a b s c,此時分別對左右兩邊的值進行列舉,這一步複雜度為o n 2 接著就用二分法查詢滿足該等式的最大s值,複雜度為o n ...