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

 

这道题,其实是一个贪心......

没错真的是贪心......

因为1:2+1:2=1:2

所以我们只有按黑白球总比例拆分就能分最多组......

嗯,就这么简单粗暴......

代码:(注意一定要定成long long,int不够大)

输入,sum[i]是黑白球总数

1 for(long long i=1;i<=n;i++)
2     {
3         cin>>a[i]>>b[i];
4         sum[b[i]]=sum[b[i]]+a[i];
5     }

如果只有一种球,怎么分不用说

 1 if(sum[0]==0)
 2     {
 3         cout<<sum[1];
 4         return 0;
 5     }
 6     if(sum[1]==0)
 7     {
 8         cout<<sum[0];
 9         return 0;
10     }

交叉相乘知道不

sum[x]/sum[y]=ans[x]/ans[y]=>sum[x]*ans[y]=sum[y[*ans[x]

如果加上a[i]大于比例,总组数加一

但是有这种情况:1/10>1/11 1/10<2/11

为了避免要判断:sum[x]*ans[y]%sum[y]==0

 1 for(long long i=1;i<=n;i++)
 2     {
 3         long long x=b[i];
 4         long long y;
 5         if(x==0)
 6         {
 7             y=1;
 8         }
 9         else
10         {
11             y=0;
12         }
13         if(sum[x]*ans[y]%sum[y]==0)
14         {
15             long long cot=sum[x]*ans[y]/sum[y]-ans[x];
16             if(cot<=a[i]&&cot>=1)
17             {                
18                 ans1++;
19             }
20         }
21         ans[x]=ans[x]+a[i];
22     }

完整代码看下方

 1 #include<iostream>
 2 using namespace std;
 3 long long ans1=0;
 4 long long a[110013],b[110013];
 5 long long sum[110013]={0};
 6 long long ans[110013]={0};
 7 long long n;
 8 int main()
 9 {
10     cin>>n;
11     for(long long i=1;i<=n;i++)
12     {
13         cin>>a[i]>>b[i];
14         sum[b[i]]=sum[b[i]]+a[i];
15     }
16     if(sum[0]==0)
17     {
18         cout<<sum[1];
19         return 0;
20     }
21     if(sum[1]==0)
22     {
23         cout<<sum[0];
24         return 0;
25     }
26     for(long long i=1;i<=n;i++)
27     {
28         long long x=b[i];
29         long long y;
30         if(x==0)
31         {
32             y=1;
33         }
34         else
35         {
36             y=0;
37         }
38         if(sum[x]*ans[y]%sum[y]==0)
39         {
40             long long cot=sum[x]*ans[y]/sum[y]-ans[x];
41             if(cot<=a[i]&&cot>=1)
42             {                
43                 ans1++;
44             }
45         }
46         ans[x]=ans[x]+a[i];
47     }
48     cout<<ans1;
49 } 

话说LQX真的处处被高老师针对呢,他到底怎么招惹高老师了?(高老师干得漂亮!)

 

在暴风雨中低着头,是为了不让雨水模糊风雨后眼中的彩虹。

原文地址:https://www.cnblogs.com/DK-F/p/9466956.html