非常男女(计蒜客)

 

  • 近来,蒜头君致力于研究班上同学的配对问题(别想太多,仅是舞伴),通过各种推理和实验,他掌握了大量的实战经验。例如,据他观察,身高相近的人似乎比较合得来。
  • 万圣节来临之际,蒜头君准备在学校策划一次大型的“非常男女”配对活动。对于这次活动的参与者,蒜头君有自己独特的选择方式。他希望能选择男女人数相等且身高都很接近的一些人。这种选择方式实现起来很简单。他让学校的所有人按照身高排成一排,然后从中选出连续的若干个人,使得这些人中男女人数相等。为了使活动更热闹,蒜头君当然希望他能选出的人越多越好。请编写程序告诉他,他最多可以选出多少人来。
  • 输入格式

  • 第一行有一个正整数 n (1≤n≤100000),代表学校的人数。
  • 第二行有 n 个用空格隔开的数,这些数只能是 0或 1,其中0 代表一个女生,1代表一个男生。
  • 输出格式
  • 输出一个非负整数,这个数表示在输入数据中最长的一段男女人数相等的连续子序列长度。
  • 样例输入
  • 9
  • 0 1 0 0 0 1 1 0 0
  • 样例输出
  • 6
  • 代码
    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    int main(){
        int n;//人数
        cin>>n;
        vector <int> a(n);//输入数据,男生为1 女生为0
        vector <int> b(n);//新数组,将女生看成-1
        int num=0;
        for(int i=0;i<n;i++){
            cin>>a[i];
            if (a[i]==0) {
                b[i]=a[i]-1;
                num++;//记录0的个数,如果全部为0,则直接输出0
            }
            else b[i]=a[i];
        }
        vector <int> sum(n);//存储前缀和
        sum[0]=a[0];
        for(int i=1;i<n;i++)
            sum[i]=sum[i-1]+b[i];//前缀和
        
        //特殊情况,全部是男生或者全部是女生
        if(num==n||sum[n-1]==n){
            cout<<0<<endl;
            return 0;
        }
        int MAX=0;//最大值
        int cnt=0;
        const int sti=n;
        for(int i=0;i<n;i++){
            if(i>n-MAX){//加这个条件会少处理一些,节约时间
                cout<<MAX<<endl;
                return 0;
            }
            for(int j=n-1;j>=0;j--){
                //从女孩开始的情况
                if(b[i]==-1){
                    //不带b[i]
                    //如:10
                    //0 0 0 0 0 1 1 1 1 0
                    if(sum[i]==sum[j]){
                        cnt=j-i;
                        MAX=max(cnt,MAX);
                        //cout<<MAX<<endl;
                        //return 0;
                        break;
                    }
                    //带上b[i]
                    //如:10
                    //0 1 0 1 0 1 0 1 0 1
                    if(sum[i]==sum[j]-1){
                        cnt=j-i+1;
                        MAX=max(cnt,MAX);
                        break;
                    }
                }
                else if(b[i]==1){//从男孩开始
                    if(sum[i]==sum[j]+1){
                        cnt=j-i+1;
                        MAX=max(cnt,MAX);
                        //cout<<MAX<<endl;
                        //return 0;
                        break;
                    }
                }
            }
        }
        //cout<<MAX<<endl;
        return 0;
    }

     

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值