题目链接:http://codeforces.com/problemset/problem/371/C
题意:做汉堡要3种材料,给出一个字符串表示每种材料要多少,给出每种材料有多少,给出每种材料价格有多少,给出你现在有多少钱,问你最多可以做几个汉堡
思路:最近看到这种题目就立刻想到二分了,二分最多做几个汉堡然后判断钱够不够就可以了,注意有的材料可能不被用到,直接模拟也行,先把原来的材料用完并且做够100个汉堡(材料不够就用钱补,先做够100个防止剩下的材料对购买方案产生影响,初始材料每一样不超过100),然后在判断剩下的钱够几个汉堡就可以了,感觉还是二分比较容易想到
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define inf 2000000000000
#define LL long long
using namespace std;
char ch[130];
int b,s,c,nb,ns,nc,pb,ps,pc;
LL mon;
int judge(LL m)
{
LL bb=(m*b-nb)*pb,ss=(m*s-ns)*ps,cc=(m*c-nc)*pc;
if (bb<0) bb=0;
if (ss<0) ss=0;
if (cc<0) cc=0;
if (bb+ss+cc<=mon) return 1;
else return 0;
}
int main()
{
while (scanf("%s",&ch)!=EOF)
{
int len=strlen(ch);
b=s=c=0;
for (int i=0;i<len;i++)
{
if (ch[i]=='B') b++;
else if (ch[i]=='S') s++;
else if (ch[i]=='C') c++;
}
scanf("%d%d%d",&nb,&ns,&nc);
scanf("%d%d%d",&pb,&ps,&pc);
scanf("%I64d",&mon);
LL l=1,r=inf;
while (l<r)
{
LL mid=(l+r)>>1;
if (judge(mid))
{
l=mid+1;
}
else
{
r=mid;
}
}
printf("%I64d\n",l-1);
}
}