题目:
分析:
这么难的题,作为菜鸡的我,当然是果断选择放弃。
题解:
有无的判断:可以根据1的个数是否是3的倍数。这是二进制数的特征!
那么思路就很清晰了。分1的个数。
1.首先同时到三份的最后一个位置。
2.根据最后一份的零开始对第一二份开始补零。
3.补零完成,那么剩余的0放在首部,对数的大小没影响。
4.逐个位置判断3份的对应的数是否相等。
代码:
int main()
{
vector<int> A;
int all=0;
vector<int> v(2,-1);
int ok=1;
//判断全零的情况
for(int i=0;i<A.size();i++)
if(A[i]) {
ok=0;
break;
}
if(ok)
{
v[0]=0;
v[1]=2;
return v;
}
for(int i=0;i<A.size();i++)
{
if(A[i]) all++;
}
if(all%3!=0) return v;
int a1;//从头开始数,停在第一份的结束位置。第一份的最后一个一处
int a2;//倒着来,先停在第三份的第一个1,再停在第二份的最后一个1处。
int a3;//停在第三份的最后一个1处。
int t=all/3;
//a3
for(int i=A.size()-1;i>=0;i--)
{
if(A[i]) {
a3=i;
break;
}
}
all=0;
//a2
for(int i=A.size()-1;i>=0;i--)
{
if(A[i])
{
all++;
if(all==t+1) {
a2=i;
break;
}
}
}
all=0;
//a1
for(int i=0;;i++)
{
if(A[i])
{
all++;
if(all==t) {
a1=i;
break;
}
}
}
//补零
for(int k=0;k<A.size()-a3-1;k++)
{
if(A[a1+1]||A[a2+1]) return v;
a1++;
a2++;
}
//判断三者是否相等。 相等 a1 a2+1 就是答案。
int aa1=a1;
int aa2=a2;
int aa3=A.size()-1;
for(int i=0;i<t;)
{
if(A[aa1]==A[aa2]&&A[aa3]==A[aa2])
{
if(A[aa1]) i++;
}
else return v;
aa1--;
aa2--;
aa3--;
}
v[0]=a1;
v[1]=a2+1;
return v;
}