Cod sursa(job #1050605)

Utilizator CosminRusuCosmin Rusu CosminRusu Data 8 decembrie 2013 20:05:05
Problema Algola Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <iostream>
#include <vector>
#include <bitset>

using namespace std;

const char infile[] = "input.in";
const char outfile[] = "output.out";

//ifstream cin(infile);
//ofstream cout(outfile);

const inline int min(const int &a, const int &b) { if( a > b ) return b;   return a; }
const inline int max(const int &a, const int &b) { if( a < b ) return b;   return a; }
const inline void Get_min(int &a, const int b)    { if( a > b ) a = b; }
const inline void Get_max(long long &a, const long long b)    { if( a < b ) a = b; }

string S;
long long nb, ns, nc, sb, ss, sc, pb, ps, pc, money;

inline bool Check(long long x) {
    long long actb = max(x * sb - nb, 0LL) * pb;
    long long acts = max(x * ss - ns, 0LL) * ps;
    long long actc = max(x * sc - nc, 0LL) * pc;
    return ((actb + acts + actc) <= money);
}

int main() {
    cin >> S >> nb >> ns >> nc >> pb >> ps >> pc >> money;
    for(long long i = 0, n = S.size() ; i < n ; ++ i) {
        sb += (S[i] == 'B');
        ss += (S[i] == 'S');
        sc += (S[i] == 'C');
    }
    long long li = 0, ls = 2000000000000ll, Ans = 0;
    while(li <= ls) {
        long long mid = (li + ls) / 2;
        if(Check(mid)) {
            Ans = mid;
            li = mid + 1;
        }
        else ls = mid - 1;
    }
    cout << li - 1 << '\n';
    return 0;
}