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