题目:Problem - B - Codeforces
总结:
对于按位与之和为0的前缀及记作为一组。便可求出最小数中最大组。
代码献上:(贪心)
#include<iostream>
using namespace std;
int T;
int n, a[200005];
int main()
{
cin >> T;
while (T--) //多样例测试
{
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
int now = a[1], ans = 0; //排除啊a[1]为0的情况
for (int i = 2; i <= n; i++)
{
if (now == 0) //判断前缀按位与是否为0
{
now = a[i]; //位置更新
ans++; //分的组数加一
}
else
{
now &= a[i]; //求前缀按位与
}
}
if (now == 0) //判断余下的是否为0
ans++; //为零组数加一
//不为零便不做处理与前面的按位与为一的看作一组
cout << max(ans, 1) << '\n';
}
}