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;
}