题意:
你有一个长度为N的数列。该数列仅由0和1组成。你可以任意次进行如下操作:
设当前数列长度为L,选择一段区间1<=l<r<=L,将该区间移除,得到该区间所有数的异或和。
问你能得到的分值之和最大是多少。
题解:为了使得答案最大,我们优先选择由01两个字符串构成的组合(01,10)删去,这样可以使得每次的答案稳定+1.
然后我们思考剩下的部分的组成结构。如果剩下的部分全为0,那么将无法获得更多的答案;如果剩下部分全为1,那么我们选择111组合作为一部份删除,这样答案也会稳定+1.
AcCode:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
void solve(){
ll n;
scanf("%lld",&n);
ll num0=0,num1=0;
for(int i=1;i<=n;i++){
ll t;
scanf("%lld",&t);
if(t)num1++;
else num0++;
}
if(num1<=num0)printf("%lld\n",num1);
else printf("%lld\n",num0+(num1-num0)/3);
}
int main(){
ll T;
scanf("%lld",&T);
while(T--) solve();
return 0;
}