题意:

你有一个长度为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;
}