做汉堡

来源:互联网 发布:太原网页搜索优化 编辑:程序博客网 时间:2024/04/27 17:36

QAQ
思路很简单,就是二分能做的个数
如果钱够就增大做的个数
不够就减少
主要是右边界的判断
保证钱<=1e12
然后保证价钱>=1,原本的材料<=100
最极端的情况也就是可以做1e12+100个汉堡啦
要注意好多变量要搞成long long

#include <cstdio>#include <cstring>#include <iostream>using namespace std;int b,s,c;int nb,ns,nc;int pb,pc;int ps;long long mon;char ss[102];int check(long long mid){    long long xm=0;    long long xb=b*mid;    long long xs=s*mid;    long long xc=c*mid;    if(xb>nb)      xm+=(xb-nb)*pb;    if(xs>ns)      xm+=(xs-ns)*ps;    if(xc>nc)      xm+=(xc-nc)*pc;    if(xm>mon) return 0;    return 1;}int main(){    scanf("%s",ss);    for(int i=0;i<strlen(ss);i++)     {        if(ss[i]=='B') b++;        if(ss[i]=='S') s++;        if(ss[i]=='C') c++;      }     cin>>nb>>ns>>nc>>pb>>ps>>pc;     cin>>mon;     long long l=0;long long r=1e14;     while(l<=r)     {        long long mid=(l+r)/2;        if(check(mid)) l=mid+1;        else           r=mid-1;     }     cout<<r;     return 0;} 

方法二:贪心

我们先处理出原本手中的材料可以做出汉堡的个数
然后那种材料不够就用钱买哪种材料
当都不够时
就直接用钱除就行啦

#include <cstdio>#include <cstring>#include <iostream>using namespace std;int b,s,c;int nb,ns,nc;int pb,pc;int ps;long long mon;char ss[102];long long ans=0;int main(){    scanf("%s",ss);    for(int i=0;i<strlen(ss);i++)     {        if(ss[i]=='B') b++;        if(ss[i]=='S') s++;        if(ss[i]=='C') c++;      }     cin>>nb>>ns>>nc>>pb>>ps>>pc;     cin>>mon;     while(nb>=b&&nc>=c&&ns>=s)     {        ans++;        nb-=b;        nc-=c;        ns-=s;     }     if(!b) nb=0;     if(!s) ns=0;     if(!c) nc=0;     int flag=0;     while(nb>0||nc>0||ns>0)     {        int k=max(b-nb,0)*pb+max(s-ns,0)*ps+max(c-nc,0)*pc;        if(mon>=k)        {            mon-=k;            ans++;            nb-=b;            nc-=c;            ns-=s;            nb=max(nb,0);            nc=max(nc,0);            ns=max(ns,0);        }        else         {            flag=1;            break;         }     }     if(!flag)      {        int k=s*ps+b*pb+c*pc;        ans+=mon/k;      }     cout<<ans;     return 0;} 
原创粉丝点击