题解链接点这里
自己的非AC代码
#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
using namespace std;
const int inf = 0x3f3f3f3f;
int t, n;
int a[110];
int main()
{
cin >> t;
while(t--)
{
cin >> n;
int res = inf;
if(n == 1) {
scanf("%d",&a[1]);
cout << a[1] << endl;
} else if(n == 2) {
scanf("%d%d",&a[1],&a[2]);
printf("%d\n",a[1]&a[2]);
}else if(n != 0){
for(int i = 1; i <= n; i++)
{
scanf("%d",&a[i]);
}
for(int i = 1; i <= n; i++)
{
for(int j = i + 1; j <= n; j++)
{
res = min(res,a[i] & a[j]);
}
}
printf("%d\n",res);
}else if(n == 0){
printf("0\n");
}
}
return 0;
}
自己还是没考虑好,因为有些边界情况,通过以上的方法触碰不到,所以有一种办法:把每个数字从左至右挨个 &操作,这样一遍下来之后,一定是获得该序列的最小值,因为大的数字跟小的数字&,之后,都会变小。例如
5 -> 0 1 0 1
3 -> 0 0 1 1 &之后变成
1 -> 0 0 0 1
改进后的AC代码
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
int main()
{
int t;
cin >> t;
while(t--)
{
int n,res, s;
cin >> n;
for(int i = 0; i < n; i++)
{
cin >> s;
if(i == 0) res = s;
else res = (res & s);
}
cout << res << endl;
}
return 0;
}