黑白球
贪心(不信).....,难点是你要去看是加多了,还是加少了.....,考虑如果黑白砖块的比是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;//输出 }