zoukankan      html  css  js  c++  java
  • Codeforces Round #622 (Div. 2) A. Fast Food Restaurant(全排列,DFS)

    Codeforces Round #622 (Div. 2) A. Fast Food Restaurant

    题意:

    你是餐馆老板,虽然只会做三道菜上菜时还有个怪癖:一位客人至少上一道菜,且一种菜最多上一次,所有客人菜单不能相同。给出三种菜的数量,问最多能接收多少客人。

    思路:

    一人一道 → 一人两道 → 一人三道。

    #include <bits/stdc++.h>
    using namespace std;
    int main()
    {
        int t;cin>>t;
        while(t--){
            int a[3];for(int &i:a) cin>>i;
            int ans=0;
            for(int i=0;i<3;i++)
                if(a[i]) --a[i],++ans;
            sort(a,a+3,greater<int>());
            for(int i=0;i<3;i++)
                if(a[i]&&a[(i+1)%3])
                    --a[i],--a[(i+1)%3],++ans;
            if(a[0]&&a[1]&&a[2]) ++ans;
            cout<<ans<<endl;
        }
        return 0;
    }

    拓展:

    你疫情在家闲的没事干多学做了几道菜。

    #include <bits/stdc++.h>
    using namespace std;
    
    const int M=3;//会做几种菜
    
    int a[M],ans;
    vector<int> index;
    
    bool ok(){
        for(int &i:index)
            if(a[i]==0) return false;
        return true;
    }
    
    void dfs(int start,int dep,int max_dep){
        if(dep>max_dep){
            if(ok()){
                for(int &i:index)  --a[i];
                ++ans;
            }
            return;
        }
        for(int i=start;i<M;i++)
            if(a[i]){
                index.push_back(i);
                dfs(i+1,dep+1,max_dep);
                index.pop_back();
            }
    }
    
    void solve(){
        for(int &i:a) cin>>i;
        sort(a,a+M,greater<int>());
        ans=0;
        for(int i=0;i<M;i++)
            dfs(0,0,i);
        cout<<ans<<endl;
    }
    
    int main()
    {
        int t;cin>>t;
        while(t--)
            solve();
        return 0;
    }
  • 相关阅读:
    算法提高 身份证号码升级
    枚举排列
    排列数
    算法训练 K好数
    算法训练 前缀表达式
    算法训练 区间k大数查询
    最大最小公倍数
    Anagrams问题
    Uiautomator 2.0
    Uiautomator 2.0
  • 原文地址:https://www.cnblogs.com/Kanoon/p/12526363.html
Copyright © 2011-2022 走看看