分析:
直接模拟就可以,有一点要注意的是由于钱的数量非常的大,1e12次,直接模拟肯定会T,中间加一个终止条件,就是当nb==nc==nm的时候,就不需要再一次又一次的模拟了,直接可以通过剩下的钱可以买多少个汉堡。
#include <iostream>
#include <vector>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <algorithm>
#include <iomanip>
#include <cmath>
#include <cstdlib>
#include <string>
#include<string.h>
#define inf 0x3f3f3f
#define sf scanf
#define pf printf
using namespace std;
typedef long long ll;
typedef pair<int ,int > P;
ll gcd(ll a,ll b) { return b>0?gcd(b,a%b):a;}
ll lcm(ll a,ll b){ return a*b/gcd(a,b);}
//head
#define maxn 310
ll t;
string str;
ll nb,nm,nc,pb,pm,pc,r,b,m,c,Min,ans;
int main(){
cin>>t;
while(t--){
ans=b=m=c=0;
Min=inf;
cin>>str;
int len=str.size();
for(int i=0;i<len;i++){
if(str[i]=='B') b++;
if(str[i]=='M') m++;
if(str[i]=='C') c++;
}
cin>>nb>>nm>>nc;
cin>>pb>>pm>>pc;
cin>>r;
// cout<<b<<m<<c;
if(b) Min=min(Min,nb/b);
if(m) Min=min(Min,nb/m);
if(c) Min=min(Min,nb/c);
if(b==0) nb=0;
if(m==0) nm=0;
if(c==0) nc=0;
nb-=Min*b;
nm-=Min*m;
nc-=Min*c;
ans=Min;
//此时nb,nm,nc是还剩下的东西
while(r>0){
if(b &&nb/b==0){ //有剩余但是剩余不足一个汉堡需要的材料
r-=(b-nb)*pb;nb=0;
}
else if(b){ //有剩余并且剩余多余一个汉堡材料
nb-=b;
}
if(m &&nm/m==0){
r-=(m-nm)*pm;nm=0;
}
else if(m){
nm-=m;
}
if(c &&nc/c==0){
r-=(c-nc)*pc;nc=0;
}
else if(c){
nc-=c;
}
if(r<0) break;
else ans++;
if(nb==0 &&nc==0&&nm==0) break; //这一步的判断非常的重要,可以减少很多的循环
}
if(r>0){
ans+=r/(b*pb+m*pm+c*pc);
}
cout<<ans<<endl;
}
return 0;
}