51nod 2494 最长配对【思维】

版权声明:转载什么的好说,附上友链就ojek了,同为咸鱼,一起学习。<br> https://blog.csdn.net/sodacoco/article/details/89278987

题目:

小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;
}

猜你喜欢

转载自blog.csdn.net/sodacoco/article/details/89278987