zoukankan      html  css  js  c++  java
  • KKT-黑白球

    【题目描述】

    LQX在高老师不在的一天当中发明了一个小游戏:将若干黑色和白色的乒乓球摆成一列。现在他想按顺序(分组时只能按照从左往右的顺序取)将这些乒乓球分成若组,使得每组的白球

    和黑球的比例相同。

    当然,他可以把所有的球直接作为一组,但是那样你就太鄙视LQX的智商了。为了增加难度,他想知道最多能分成多少组,例如,如果用0表示白球,1表示黑球的话,那么:

    100011 = 10+0011(样例1,最多分成两组,比例为1:1)

    0001110000000001 = 0001+11000000+0001(样例2,最多分成3组,比例为3:1)

    LQX在高老师不在的一天当中发明了一个小游戏:将若干黑色和白色的乒乓球摆成一列。现在他想按顺序(分组时只能按照从左往右的顺序取)将这些乒乓球分成若组,使得每组的白球

    和黑球的比例相同。

    当然,他可以把所有的球直接作为一组,但是那样你就太鄙视LQX的智商了。为了增加难度,他想知道最多能分成多少组,例如,如果用0表示白球,1表示黑球的话,那么:

    100011 = 10+0011(样例1,最多分成两组,比例为1:1)

    0001110000000001 = 0001+11000000+0001(样例2,最多分成3组,比例为3:1)

    【输入】

    第一行输入一个整数N,表示将用N行来描述这一列乒乓球。

    以下N行,每行包含两个用空格隔开的整数Ki和Ci,Ci只可能是0或1,表示在上一行结束后尾部又有了Ki个颜色为Ci的乒乓球。

    注意:连续几行的Ci可能相同。

    【输出】

    输出一行一个整数,表示最多能分成的组数。

    【输入示例】

    3

    1 1

    3 0

    2 1

    【输出示例】

    2

    【思路】

    如果每个小组比例相同,那么加在一起的比例也相同:

    001001001
    2:1 2:1 2:1
    总体2:1

    如果只有一种颜色:

        if(s[0]==0)
        {
            cout<<s[1];
            return 0;
        }
        if(s[1]==0)
        {
            cout<<s[0];
            return 0;
        }

    交差相乘:

        for(i=0; i<n; i++)
        {
            long long x=b[i];
            long long y=abs(x-1);//取反 
            if(s[x]*z[y]%s[y]==0)
            {
                long long h=s[x]*z[y]/s[y]-z[x];
                if(h>=1&&a[i]>=h)
                    Max++;
            }
            z[x]+=a[i];
        }

    【代码】

    #include<iostream>
    #include<cmath>
    using namespace std;
    long long n,a[1000000],b[1000000];
    int main()
    {
        long long i,j;
        long long s[100000],z[100000];
        cin>>n;
        for(i=0; i<n; i++)
        {
            cin>>a[i]>>b[i];
            s[b[i]]+=a[i];
        }
        if(s[0]==0)
        {
            cout<<s[1];
            return 0;
        }
        if(s[1]==0)
        {
            cout<<s[0];
            return 0;
        }
        long long Max=0;
        for(i=0; i<n; i++)
        {
            long long x=b[i];
            long long y=abs(x-1);//取反 
            if(s[x]*z[y]%s[y]==0)
            {
                long long h=s[x]*z[y]/s[y]-z[x];
                if(h>=1&&a[i]>=h)
                    Max++;
            }
            z[x]+=a[i];
        }
        cout<<Max;
        return 0;
    }

     

  • 相关阅读:
    如何增加VM Ware虚拟机的硬盘空间
    安装完成oracle 11g R2 后,使用sqlplus 报错"sqlplus: error while loading shared libraries" ...
    listener.ora
    ExtJS项目框架有关问题讨论
    Oracle启动监听报错:The listener supports no services解决
    Linq学习笔记一
    PAT 1054 The Dominant Color[简单][运行超时的问题]
    Andrew NgML第十八章大规模机器学习
    PAT 1042 Shuffling Machine[难]
    PAT 1103 Integer Factorization[难]
  • 原文地址:https://www.cnblogs.com/4D24/p/9466979.html
Copyright © 2011-2022 走看看