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