1. 程式人生 > 實用技巧 >牛牛愛位運算(與遠算,相與的結果小於等於自身)

牛牛愛位運算(與遠算,相與的結果小於等於自身)

題目連結:https://ac.nowcoder.com/acm/contest/6885/B
來源:牛客網
時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 262144K,其他語言524288K
64bit IO Format: %lld

題目描述:

牛牛正在學習位運算
他剛剛理解&的用法(and),準備趁熱打鐵,做做下面這題:
給定一個長度為n的序列a,你需要從中挑出任意多個(可以0個)數,使得他們&起來值最大。
看起來挺簡單的,可是牛牛就是不會做。
比如說選出五個數1,3,5,7,9,他們&起來的值就是1&3&5&7&9=1

輸入描述:
第一行,輸入一個數T,表示資料組數。


第2~(T+1)行,每行讀入一個數n,接下來讀入n個數,第i個數表示ai。

輸出描述:
對於每一組資料,你需要輸出&的最大值。
示例1
輸入
2
1 5
2 5 5
輸出
5
5
說明
第一組資料,顯然取5是最優的;
第二組資料,可以取兩個5,5&5=5是最優的。
備註:
資料保證1<=T<=100000, 1<=ai,n<= 10^5,並且∑n≤10 ^6。

題意:就是讓你選擇任意多個(可以0個)數,讓他們&起來值是最大的。
思路:直接找出n個數中最大的數即可。
原因:與(&)運算,一個數與其它任何數&,結果只會小於等於自己。
1&1=1
1&0=0
0&1=0


0&0=0
假如一個數的二進位制 num1 =0011010100100(前面補0)
另外一個數的二進位制 num2 = 1001000100111
相與的結果是:       0001000100100
顯然相與後的結果顯然是變小了
除非這兩個數相等,不然相與後一定變小。

程式碼:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     int t;
 6     cin>>t;
 7     while(t--)
 8     {
 9         int n;
10 int x; 11 int ans=0; 12 cin>>n; 13 for(int i=0;i<n;i++) 14 { 15 cin>>x; 16 ans=max(x,ans); 17 } 18 cout<<ans<<endl; 19 } 20 return 0; 21 }

加油!

共同努力!

Keafmd