2018NJUPT 第二场排位赛 D题(模拟)

这里写图片描述

这里写图片描述
分析:
直接模拟就可以,有一点要注意的是由于钱的数量非常的大,1e12次,直接模拟肯定会T,中间加一个终止条件,就是当nb==nc==nm的时候,就不需要再一次又一次的模拟了,直接可以通过剩下的钱可以买多少个汉堡。

#include <iostream>
#include <vector>  
#include <list>  
#include <map>  
#include <set>  
#include <queue>  
#include <stack>  
#include <algorithm>   
#include <iomanip>  
#include <cmath>  
#include <cstdlib>  
#include <string>
#include<string.h>  
#define inf 0x3f3f3f
#define sf scanf
#define pf printf
using namespace std;
typedef long long ll;
typedef pair<int ,int > P;
ll gcd(ll a,ll b) { return b>0?gcd(b,a%b):a;}
ll lcm(ll a,ll b){ return a*b/gcd(a,b);}
//head
#define maxn 310
ll t;
string str;
ll nb,nm,nc,pb,pm,pc,r,b,m,c,Min,ans;

int main(){
    cin>>t;
    while(t--){
        ans=b=m=c=0;
        Min=inf;
        cin>>str;
        int len=str.size();
        for(int i=0;i<len;i++){
            if(str[i]=='B') b++;
            if(str[i]=='M') m++;
            if(str[i]=='C') c++;
        }
        cin>>nb>>nm>>nc;
        cin>>pb>>pm>>pc;
        cin>>r;
    //  cout<<b<<m<<c;
        if(b) Min=min(Min,nb/b);
        if(m) Min=min(Min,nb/m);
        if(c) Min=min(Min,nb/c);
        if(b==0) nb=0;
        if(m==0)  nm=0;
        if(c==0)  nc=0;
        nb-=Min*b;
        nm-=Min*m;
        nc-=Min*c;
        ans=Min;
        //此时nb,nm,nc是还剩下的东西 
        while(r>0){
            if(b &&nb/b==0){        //有剩余但是剩余不足一个汉堡需要的材料 
            r-=(b-nb)*pb;nb=0;
            }
            else if(b){             //有剩余并且剩余多余一个汉堡材料 
                nb-=b;
            }

            if(m &&nm/m==0){
                r-=(m-nm)*pm;nm=0;
            }
            else if(m){
                nm-=m;
            }

            if(c &&nc/c==0){
                r-=(c-nc)*pc;nc=0;
            }
            else if(c){
                nc-=c;
            }   

            if(r<0) break;
            else ans++;
            if(nb==0 &&nc==0&&nm==0) break; //这一步的判断非常的重要,可以减少很多的循环     
        }
        if(r>0){
            ans+=r/(b*pb+m*pm+c*pc);
        }
        cout<<ans<<endl;
    }
    return 0;   
}

猜你喜欢

转载自blog.csdn.net/qq_37360631/article/details/81545180