挺坑的一个题
没相除思路来感觉就~
比例的确定的
也即是每次B的总和与W的总和的比值
然后从前往后跑一遍即可
代码必须要加紧练,这个题找bug补了一个小时~~~
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
bool k[100100];
int a[101000];
char s[10];
#define p(a) printf("%d\n",a);
LL gcd(LL a,LL b)
{
return b==0?a:gcd(b,a%b);
}
int main()
{
int t;
scanf("%d",&t);
while(t--){
memset(k,0,sizeof(k));
int n;int w=0,b=0;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d%s",&a[i],s);
if(s[0]=='B') b+=a[i];
else { w+=a[i]; k[i]=1; }
}
//printf("%d %d\n",b,w);
if(b==0||w==0) {
LL sum=0;
for(int i=0;i<n;i++) sum+=a[i];
printf("%lld\n",sum);
continue;
}
LL c=gcd(b,w);
LL B=b/c,W=w/c;
//printf("%d %d \n",W,B);
LL ans=0;
int w1=0,b1=0;
for(int i=0;i<n;i++){
if(!w1&&!b1){
if(k[i]) w1+=a[i];
else b1+=a[i];
//printf("w1 %d b1 %d\n",w1,b1);
}
else if(k[i]){
LL left_w=b1*W/B; //printf("%lld %d %d %d %lld %lld\n",left_w,w1,a[i],b1,B,W);
//printf("%d%d%d\n",left_w-w1<=a[i],left_w-w1>0,left_w*B==b1*W);
if( left_w-w1<=a[i] && left_w-w1>0 && left_w*B==b1*W ){
//printf("fsa\n");
a[i]-=left_w-w1;++ans;
b1=0,w1=a[i];
// cout<< "#"<<w1<<b1<<endl;
}
else {
w1+=a[i];
}
}
else {
LL left_b=w1*B/W; //cout<< "#"<<w1<<b1<<endl;
if( (left_b-b1<=a[i]&&left_b-b1>0)&&left_b*W==w1*B){
// printf("bbbb\n");
a[i]-=left_b-b1;++ans;
w1=0,b1=a[i];
//printf("w1 %d b1 %d\n",w1,b1);
}
else {
b1+=a[i];
}
}
}
printf("%lld\n",ans);
}
return 0;
}