题目: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';
}
}

该程序使用贪心算法解决Codeforces上的Problem-B问题。通过对输入的整数序列进行按位与操作,找出使得前缀和为0的最长连续子序列,计算出这样的子序列数量。如果所有数的按位与为0,则结果加1。最后输出最大组数,确保结果至少为1。
1011

被折叠的 条评论
为什么被折叠?



