列表

详情


NC216206. DrinkingTimeIII

描述

来到了鸽子转转转酒吧,向酒保 点了亿杯红酒、 杯红茶、 杯耗子尾汁。 作为一名正常的上班族酒保,当然拒绝了她的不合理要求,并且又给了她 一道题让他自己玩去。

题目是这样的:给出三种饮料各自的数量,有三种鸡尾酒的调制规则:
  • (使用一杯饮料和一杯饮料可以调制出一杯鸡尾酒,下面两种规则以此类推)


轻松就求出了能调出的鸡尾酒的最大数量,但是 又开始刁难他了。给每杯饮料都标了不同的编号(A_1,A_2,...,A_a,B_1,B_2,...,B_b,C_1,C_2,...,C_c),同时还要 算出可以调出最多鸡尾酒的方案数,但是 太菜了,于是便来向你寻求帮助,你能告诉她答案吗?

输入描述

输出只有三个整数,分别表示三种饮料的个数。

输出描述

输出一个整数,表示可以调出最多鸡尾酒的方案数,调不出鸡尾酒也被认为是一种方案

示例1

输入:

1 2 3

输出:

9

说明:

Hile{} 调出最多鸡尾酒的方案总有以下九种:
1. A_1-B_1,C_1-C_2、2. A_1-B_1,C_1-C_3
3. A_1-B_1,C_2-C_3、4. A_1-B_2,C_1-C_2
5. A_1-B_2,C_1-C_3、6. A_1-B_2,C_2-C_3
7. A_1-C_1,C_2-C_3、8. A_1-C_2,C_1-C_3
9. A_1-C_3,C_1-C_2

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++11) 解法, 执行用时: 2ms, 内存消耗: 492K, 提交时间: 2020-12-26 18:05:36

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=10;
ll a,b,c,ans,mx,F[20],P[20];
ll C(int n,int m){
	return F[n]/F[m]/F[n-m];
}
ll calc(int x,int y,int z){
	return C(a,x)*C(a-x,y)*C(b,x)*C(c,y)*C(c-y,2*z)*F[2*z]/F[z]/P[z]*F[x]*F[y];
}
int main(){
	for(int i=F[0]=1;i<=N;i++)F[i]=F[i-1]*i;
	for(int i=P[0]=1;i<=N;i++)P[i]=P[i-1]*2;
	cin>>a>>b>>c;
	for(ll x=0;x<=10;x++){//x=a+b
	 	for(ll y=0;y<=10;y++){//y=a+c
	 		for(ll z=0;z<=10;z++){//z=c+c
				if(x+y<=a&&x<=b&&2*z+y<=c){
	 				if(x+y+z>mx){
	 					mx=x+y+z;
	 					ans=calc(x,y,z);
					 }else if(x+y+z==mx){
					 	ans+=calc(x,y,z);
					}
				}
			}
		}
	}
	cout<<ans;
}

上一题