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真的处处被高老师针对呢,他到底怎么招惹高老师了?(高老师干得漂亮!)
在暴风雨中低着头,是为了不让雨水模糊风雨后眼中的彩虹。