本文主要是介绍[ACM] FZU 2086 餐厅点餐 (枚举),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
roblem Description
Jack最近喜欢到学校餐厅吃饭,好吃干净还便宜。
在学校餐厅,有a种汤,b种饭,c种面条,d种荤菜,e种素菜。
为了保证膳食搭配,Jack每顿饭都会点1~2样荤菜,1~2样素菜(不重复)。同时,在Jack心情好的时候,会点一样饭,再配上一种汤。在心情不好的时候,就只吃一种面条。
因为经济有限,Jack每次点餐的总价在min~max之间。Jack想知道,总共有多少种不同的点餐方案。
Input
输入数据第一行包含一个整数T,表示测试数据的组数,对于每组测试数据:
第一行为整数a,b,c,d,e(0<a,b,c,d,e<=10)
第二行为a个大于零的整数,表示a种汤的价格
第三行为b个大于零的整数,表示b种饭的价格
第四行为c个大于零的整数,表示c种面条的价格
第五行为d个大于零的整数,表示d种荤菜的价格
第六行为e个大于零的整数,表示e种素菜的价格
第七行为两个整数min max,表示每次点餐的价格范围
Output
Sample Input
Sample Output
Source
福州大学第九届程序设计竞赛
解题思路:
又是因为没看清题意。。。点餐不光要有荤有素,还必须有饭汤或面条。
代码:
#include <iostream>
#include <string.h>
#include <algorithm>
#include <stdio.h>
#include <iomanip>
#include <cmath>
#include <stack>
#include <queue>
#include <map>
#include <vector>
#include <ctype.h>
using namespace std;
int tang,fan,mian,hun,su;
int Tang[11],Fan[11],Mian[11],Hun[11],Su[11];
int Min,Max;bool ok(int n)
{if(n>=Min&&n<=Max)return true;return false;
}
int p[100000];int main()
{int t;cin>>t;while(t--){cin>>tang>>fan>>mian>>hun>>su;for(int i=1;i<=tang;i++)scanf("%d",&Tang[i]);for(int i=1;i<=fan;i++)scanf("%d",&Fan[i]);for(int i=1;i<=mian;i++)scanf("%d",&Mian[i]);for(int i=1;i<=hun;i++)scanf("%d",&Hun[i]);for(int i=1;i<=su;i++)scanf("%d",&Su[i]);cin>>Min>>Max;int cnt=0;int len=0;for(int i=1;i<=hun;i++)//一荤一素{if(Hun[i]>=Max)continue;for(int j=1;j<=su;j++){if(Su[j]>=Max)continue;int temp=Hun[i]+Su[j];if(temp<Max)p[++len]=temp;}}for(int i=1;i<=hun;i++)//一荤两素{if(Hun[i]>=Max)continue;for(int j=1;j<=su;j++){if(Su[j]>=Max)continue;for(int k=j+1;k<=su;k++){if(Su[k]>=Max)continue;int temp=Hun[i]+Su[j]+Su[k];if(temp<Max)p[++len]=temp;}}}for(int i=1;i<=hun;i++)//两荤一素{if(Hun[i]>=Max)continue;for(int j=i+1;j<=hun;j++){if(Hun[j]>=Max)continue;for(int k=1;k<=su;k++){if(Su[k]>=Max)continue;int temp=Hun[i]+Hun[j]+Su[k];if(temp<Max)p[++len]=temp;}}}for(int i=1;i<=hun;i++)//两荤两素{if(Hun[i]>=Max)continue;for(int j=i+1;j<=hun;j++){if(Hun[j]>=Max)continue;for(int s=1;s<=su;s++){if(Su[s]>=Max)continue;for(int q=s+1;q<=su;q++){if(Su[q]>=Max)continue;int temp=Hun[i]+Hun[j]+Su[s]+Su[q];if(temp<Max)p[++len]=temp;}}}}for(int i=1;i<=len;i++){for(int fan1=1;fan1<=fan;fan1++){int p1=p[i];p1+=Fan[fan1];int d=p1;for(int tang1=1;tang1<=tang;tang1++){p1=d;//注意这一句p1+=Tang[tang1];if(ok(p1))cnt++;}}for(int mian1=1;mian1<=mian;mian1++){int p2=p[i];p2+=Mian[mian1];if(ok(p2))cnt++;}}cout<<cnt<<endl;}return 0;
}
这篇关于[ACM] FZU 2086 餐厅点餐 (枚举)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!