題目介紹:
【背景介紹】
古堡,闇鴉,斜陽,和深淵……
等了三年,我獨自一人,終於來到了這裡……
「終焉的試煉嗎?就在這裡嗎?」我自言自語道。
「終焉的試煉啊!就在這裡啊!」我再一次自言自語道。
「這背後可能有那個東西嗎?」我自言自語道。
「這背後一定有那個東西呢!」我又一次自言自語道。
我沉默著,踏上黑漆漆的索橋,小心翼翼地,拿出鋒利的注入我靈魂的雙劍……
「那麼,我們開始吧……」我最後一次自言自語道。
【題目描述】
my soul of my sowrd!
終焉的試煉即將到來,作為一名有修養的劍士,雖然沒有習得n刀流但是二刀流還是沒問題的。然而我也是個劍的收藏者,家裡屯著n把劍,每一把劍都有乙個靈魂值a[i],由於一些劍之間可能有共鳴,所以我需要兩把契合度最高的劍。據劍聖所說,兩把編號為i,j劍的契合度為a[i] and a[j]。如何深得劍的靈魂呢?
注:and 為按位與運算,先將數轉成二進位制,不滿位數的補全0,然後成為兩個長度相同的二進位制數,處理的時候,兩個相應的二進位制位都為1,該位的結果值才為1,否則為0。
n ≤ 1,000,000,0 ≤ a[i] < 2^31
———————————–華麗分割線————————————
題目簡述:給一堆數,求其中最大的任意兩個數的and值。 及求max(a[i] and a[j])。
——————————–現在告訴你—————————————
思路:
因為這個n<=106
,所以要是n2
的話你可以看看你的電腦是否有高配的計算速度。
考慮到這a[i]的位數頂死只有31位,又和位運算有關,我們可以分位考慮。
正解
兩個數and後,要使其最大,就是讓越高為為1越好,所以我們可以從高往低搜。遵循以下兩個原則即可更行答案。
設現在選的答案為ans,當前正在選第i位,當前的數為a[j]。
1:a[j]必須與之前所選的每一位都要符合,即:a[j]&ans=ans;
2:a[j]的第i位必須為1,即:a[j]&(2^(i-1))=2^(i-1);
符合這兩個條件就可以的a[j]如果超過兩個就可以更新答案了。
時間複雜度:o(31*n); 空間複雜度:o(n);
#include
#include
#define fo(i,a,b) for(int i=a; i<=b; i++)
#define fod(i,a,b) for(int i=a; i>=b; i--)
using
namespace
std;
const
int maxn=1000005;
int n;
long
long a[maxn],ans;
int main()
printf("%lld",ans);
}
—————————華麗分割線——————————————-那麼第一次寫就這樣結束了,中途中我還問了不少的人這個符號那個符號怎麼打。不過打完後覺得挺爽的。
NOIP2015模擬11 5 旅行
經過觀察,可以發現題目有乙個比較不錯的性質 1 一條合法的路徑必須由兩條路徑組成,一條是奇數,另一條是偶數。所以我們可以先把每乙個點到達根節點的路徑求出來,深度為奇數的點放進乙個a aa陣列裡,偶數的放進b bb陣列裡,再給他們分別進行排序。然後進行兩兩結合,先把a陣列裡的所有數跟b1b b1 結合...
NOIP2015模擬11 3 裝飾大樓
給出乙個序列a,ai表示對於乙個h序列來講,以i結尾的lis的長度。h中的數兩兩不等。現在你知道了a刪去乙個數之後的序列b 未知刪掉哪位 求a序列有多少種。a 10 6 好多細節呀!不爽,懶得打題解。可以發現,對於乙個序列a,它滿足條件的前提就是,對於每乙個ai,都存在乙個aj j i 滿足aj 1...
NOIP2015模擬11 3 備用鑰匙
你知道just odd inventions社嗎?這個公司的業務是 只不過是奇妙的發明 just odd inventions 這裡簡稱為joi社。joi社有n名員工,編號從1到n。所有員工的工作時間從時刻0持續到時刻m,時刻0和時刻m的時候,所有員工都必須在公司內。某天,出於巧合,joi社的每個員...