目录
A - Hamburgers
题意:
Polycarpus非常喜欢汉堡包。他特别喜欢自己亲手做的汉堡包。Polycarpus认为制作汉堡包的原料只有三种:面包、香肠和奶酪。他用一串字母“B”(面包)、“S”(香肠)和“C”(奶酪)写下他最喜欢的“Polycarpus汉堡”的食谱。配方中的成分从下到上,例如,配方“B SCBS”代表汉堡,其中成分从下到上依次为面包、香肠、奶酪、面包和香肠。
Polycarpus在厨房里有nb块面包、ns块香肠和nc块奶酪。此外,附近的商店有三种配料,一片面包的价格是pb卢布,一片香肠的价格是ps,一片奶酪的价格是pc。
Polycarpus有r卢布,他准备在上面购物。他最多能做多少个汉堡包?你可以假设Polycarpus不能将任何一片面包、香肠或奶酪弄碎或切片。此外,该店每种配料的数量不限。
思路:
看到这种题目就立刻想到二分了,二分最多做几个汉堡然后判断钱够不够就可以了,注意有的材料可能不被用到,直接模拟也行
代码:
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
#define ll long long
double PI = acos(-1.0);
double eps=1e-5;
char b[101];
ll nb, ns, nc;
int pb, ps, pc;
ll r;//卢布数
int lb = 0, ls = 0, lc = 0;
bool check(ll mid)
{
ll rr = r;
ll b=lb*mid;
ll s=ls*mid;
ll c=lc*mid;
if(nb<b) //不足
{
rr-=(b-nb)*pb;
}
if(ns<s) //不足
{
rr-=(s-ns)*ps;
}
if(nc<c) //不足
{
rr-=(c-nc)*pc;
}
if(rr>=0)
return true;
if(rr<0)
return false;
}
int main(void)
{
int len;
scanf("%s",b);
len=strlen(b);
for(int i=0; i<len; i++)
{
if(b[i]=='B')
lb++;
else if(b[i]=='S')
ls++;
else if(b[i]=='C')
lc++;
}
cin>>nb>>ns>>nc;
cin>>pb>>ps>>pc;
cin>>r;
ll right=r+nb+ns+nc;
ll left=0;
ll mid=0;
while(right>left)
{
mid=(left+right+1)/2;//(3+3+1)/2=3;(3+4+1)/2=4;使相差为1的两个数凑高,相同的两个数结果不变
int mark=check(mid);
if(mark==true) //mid偏小
left = mid ;
if(mark==false)//mid偏大
right=mid-1 ;
}
mid=(left+right+1)/2;//再更新一次,不然不是最新值
cout<<mid<<endl;
return 0;
}