Description Jack最近喜欢到学校餐厅吃饭,好吃干净还便宜。 在学校餐厅,有a种汤,b种饭,c种面条,d种荤菜,e种素菜。 为了保证膳食搭配,Jack每顿饭都会点1~2样荤菜,1~2样素菜(不重
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
1
2 2 2 2 2
2 3
3 1
5 2
1 4
3 6
5 8
Sample Output
3
数据不大,直接暴力就好了
#include<cstdio>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
const int maxn=1e5+10;
int T,n[5],a[5][10],f[3][111],t[3],l,r;
int main()
{
scanf("%d",&T);
while(T--)
{
for (int i=0;i<5;i++) scanf("%d",&n[i]);
for (int i=0;i<5;i++)
{
for (int j=0;j<n[i];j++) scanf("%d",&a[i][j]);
}
t[0]=t[1]=t[2]=0;
for (int i=0;i<n[3];i++) f[0][t[0]++]=a[3][i];
for (int i=0;i<n[3];i++) for (int j=i+1;j<n[3];j++) f[0][t[0]++]=a[3][i]+a[3][j];
for (int i=0;i<n[4];i++) f[1][t[1]++]=a[4][i];
for (int i=0;i<n[4];i++) for (int j=i+1;j<n[4];j++) f[1][t[1]++]=a[4][i]+a[4][j];
for (int i=0;i<n[2];i++) f[2][t[2]++]=a[2][i];
for (int i=0;i<n[0];i++) for (int j=0;j<n[1];j++) f[2][t[2]++]=a[0][i]+a[1][j];
scanf("%d%d",&l,&r);
int ans=0;
for (int i=0;i<t[0];i++)
for (int j=0;j<t[1];j++)
for (int k=0;k<t[2];k++)
if (f[0][i]+f[1][j]+f[2][k]>=l&&f[0][i]+f[1][j]+f[2][k]<=r) ans++;
printf("%d\n",ans);
}
return 0;
}