天天看点

FZU 2086 餐厅点餐

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