黑白球

贪心(不信).....,难点是你要去看是加多了,还是加少了.....,考虑如果黑白砖块的比是a1:a2,那么如果我从中分出一段b1:b2=a1:a2。所以我们的算法是能分则分。对于每段加入的球,如果它其中的一部分和当前段可以分出那就分出来,剩下的作为当前段,不然就全部加入当前段....代码:

#include<iostream>
using namespace std;
long long a[110000],b[110000];
long long sum[110000];
long long ans[110000];
long long n;
long long maxn,maxn2;
int main()
{
    cin>>n;
    for(long long i=1;i<=n;i++)
    {
        cin>>a[i]>>b[i];
        sum[b[i]]+=a[i];//统计个数 
    }
    if(!sum[0])
    {
        cout<<sum[1];
        return 0;
    }
    if(!sum[1])
    {
        cout<<sum[0];
        return 0;
    }
    for(long long i=1;i<=n;i++)
    {
        long long x=b[i];
        long long y;
        if(x==1) y=0;
        else if(x==0) y=1;//取反
        if(sum[x]*ans[y]%sum[y]==0)//判断是否除尽 
        {
            int h=sum[x]*ans[y]/sum[y]-ans[x];//要去算少了多少.... 
            if(a[i]>=h&&h>=1)
            {
                maxn++;
            }
        }
        ans[x]+=a[i];//加起来 
    }
    cout<<maxn<<endl;//输出 
}
原文地址:https://www.cnblogs.com/dai-jia-ye/p/9466365.html