Codeforces 371(#218 Div2 only) C. Hamburgers

問題

ハンバーガー一個を作るにはSがrs個, Bがrb個, Cがrc個必要である。
最初Sをns個、Bをnb個、Cをnc個持っている。


足りない材料はSを一個ps円、Bを一個pb円、Cを一個pc円で買えるが、
予算はr円。


最大でハンバーガーはいくつ作れるか求めよ。

制約条件

r≦10^12とか

方針

ハンバーガーを作る個数に関して二分探索すればいい。
個数を決めたら、足りない材料の個数がそれぞれわかるので、
予算に収まるかを調べる。

ソースコード

string s;
int nb, ns, nc, pb, ps, pc;
ll r;

int main(){
	cin >> s;
	cin >> nb >> ns >> nc;
	cin >> pb >> ps >> pc >> r;
	
	int rb = 0, rs = 0, rc = 0;
	
	rep(i, s.size()){
		if(s[i] == 'B') rb++;
		if(s[i] == 'S') rs++;
		if(s[i] == 'C') rc++;
	}
	
	ll lo = 0, hi = 1e15, mid;
	
	while(lo + 1 < hi){
		mid = (lo + hi) / 2;
		
		ll cost = 0;
		cost += max(0ll, rb * mid - nb) * pb;
		cost += max(0ll, rs * mid - ns) * ps;
		cost += max(0ll, rc * mid - nc) * pc;
		
		if(cost <= r) lo = mid;
		else hi = mid;
	}
	cout << lo << endl;
	
	return 0;
}