看到這道題的時候就直接先暴力了一發,當然我知道暴力過不了,所以就在找規律,然後把每一位對應的按位或的和列了出來,如下圖1-20
其**現了很多個相同的數,如果把這些重複的數省去,時間複雜度就會降低很多,其實列出來以後就能發現當乙個數按位或乙個比它大的數的時候它才會變,所以我們對於a和b,依次列舉ans按位或ans+1,直到大於等於b就好了。其實原理也很簡單,對於乙個數按位或乙個比它大1的數,根據按位或的性質,其實就是在這個數的最高位前加乙個1。
ac**:
#include #define ll long long
using namespace std;
int main()
ll ans = a | (a + 1);
while(ans < b)
printf("%lld\n", ans);
} return 0;
}
牛客寒假演算法基礎集訓營6
現在有正整數集合 a 和 b,每個集合裡有 n 個數,你要建立他們間的一一對映,將每對配對的數字相加可以得到 n 個和,你要做的就是最大化第 k 大的和。分別將前k大的數,乙個集合第i小的和另乙個集合第i大的,配對,得出k個數最後最小的那個數就是答案。小 q 新學會了一種魔法,可以對乙個 n行m列 ...
牛客寒假演算法基礎集訓營
首先看到這個題目資料範圍就可以知道這不是乙個可以暴力過的題。所以應該要推乙個結論。我們可以將這個同學的一來一回看成一組,那麼就可以理解為乙個來回中n可以減少n m 1 個人。那麼我們現在要讓所有人都進去,那就是看n m 1 的數量。但是有可能存在一些情況,就是說當你的倒數第二組中的回來的那趟使得n變...
2020牛客寒假演算法基礎集訓營6
先將兩個陣列排好序,從兩邊列舉最大的k個數相加,最小的就是最大的第k個數 include include include include include using namespace std const int n 100050 int a n b n n,k,ans 2e8 intmain vo...