题目:
小b有一个01序列,她想找到一个最长的区间使得这个区间的01能两两配对,即0的个数和1的个数相等。求最长区间的长度。
输入
第一行一个正整数n,表示数组长度,其中0<n≤50000; 第二行n个0或1,以空格隔开。输出
输出一个数,表示最长区间的长度输入样例
3 0 1 0输出样例
2
题目大意:
给定一个长度为n的数组,数组内数字为0/1,求该数组内一个最长序列,使该序列内部0和1的数目相等。
解题思路:
一开始觉得这不简单,不就是0和1中数目较小的 那个乘以2吗,如此,WA了6发。
然后反应过来,如果是10 00 01这种的,则最长的匹配序列长度为2,恩 ,,然后WA了4发,数据范围少看了一个0。。
所以用数组存放截止到 i 位置,有多少0或1,然后二重循环遍历,复杂度可以承受,终于A了。
实现代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main(){
int n,x,a[50001][2],ans=0;
scanf("%d",&n);
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++){
//cout<<"i="<<i<<endl;
scanf("%d",&x);
if(x==0){
a[i][0]=a[i-1][0]+1;
a[i][1]=a[i-1][1];
}
else{
a[i][0]=a[i-1][0];
a[i][1]=a[i-1][1]+1;
}
}
for(int i=n;i>=1;i--){//遍历长度
//cout<<"长度为:"<<i<<endl;
int num0;
int num1;
for(int j=1;j<=n-i+1;j++){//遍历起点
//cout<<" 起点为:"<<j<<" 终点为"<<j+i-1<<endl;
num0=a[j+i-1][0]-a[j-1][0];
num1=a[j+i-1][1]-a[j-1][1];
//cout<<" num0="<<num0<<" num1="<<num1<<endl;
if(num0==num1&&num0==i/2){
ans=i;
break;
}
}
if(num0==num1&&num0==i/2){
printf("%d",ans);
break;
}
}
return 0;
}