耀耀切克闹 发表于 2022-4-21 17:13:50

一直超时,也没有输出问题,请问怎么改?

#include<stdio.h>
int main()
{
        int i,t,a,b,c,d,e,j,min,max,m,n,p,q,g,q1,g1;
        scanf("%d",&t);
        for(i=0;i<t;i++)
        {
                int num=0,sum=0,sum1=0,sum2=0;
                scanf("%d %d %d %d %d",&a,&b,&c,&d,&e);
                int A,B,C,D,E;
                for(j=0;j<a;j++)
                scanf("%d",&A);
                for(j=0;j<b;j++)
                scanf("%d",&B);
                for(j=0;j<c;j++)
                scanf("%d",&C);
                for(j=0;j<d;j++)
                scanf("%d",&D);
                for(j=0;j<e;j++)
                scanf("%d",&E);
                scanf("%d %d",&min,&max);
                for(q=0;q<d;q++)
                {
         for(q1=0;q1<d;q++)
         {
                 if(q==q1) sum1=D;
                 else sum1=D+D;
                 for(g=0;g<e;g++)
                 {
                   for(g1=0;g1<e;g++)
                   {
                           if(g==g+1) sum2=E;
                           else sum2=E+E;
                           for(m=0;m<a;m++)
                           {
                           for(n=0;n<b;n++)
                           {
                                   sum=0;
                                sum=sum1+sum2+A+B;
                                   if(sum>=min&&sum<=max) num++;
                           }
                     }
                        for(p=0;p<c;p++)
                        {
                                sum=0;
                                sum=sum1+sum2+C;
                                if(sum2>=min&&sum2<=max) num++;
                        }
                  }
                }
          }
                }
          printf("%d\n",num);
        }
        return 0;
}
在学校餐厅,有 a 种汤,b 种饭,c 种面条,d 种荤菜,e 种素菜。为了保证膳食搭配,小王每顿饭都会点 1~2 样荤菜,1~2 样素菜(不重复)。同时,在小王心情好的时候,会点一样饭,再配上一种汤。在心情不好的时候,就只吃一种面条。因为经济有限,小王每次点餐的总价在 min~max 之间。小王想知道,总共有多少种不同的点餐方案。

输入描述
输入数据第一行包含一个整数 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, 表示每次点餐的价格范围

输出描述
对于每组测试数据,输出一行,包含一个整数,表示点餐方案数。

样例输入
Copy to Clipboard
1
2 2 2 2 2
2 3
3 1
5 2
1 4
3 6
5 8
样例输出
Copy to Clipboard
3

jhq999 发表于 2022-4-22 15:42:07

本帖最后由 jhq999 于 2022-4-22 16:04 编辑

用了最笨的方法拆解

#include<stdio.h>
void su(int **cai,int *caicount,int sum,int min,int max,int *count)
{
        int s={sum,sum};
        for (int i = 0; i < caicount; i++)
        {
                sum=s;
                sum+=cai;
                if (sum>max)continue;
                if(sum>=min)
                {
                        (*count)++;
                }
                s=sum;

                for (int j = 0; j < caicount; j++)
                {

                        if (i!=j)
                        {
                                sum=s;
                                sum+=cai;
                                if (sum>max)continue;
                                if(sum>=min)
                                {
                                        (*count)++;
                                }

                        }
                }
        }

}
void hun(int **cai,int *caicount,int sum,int min,int max,int *count)
{
        int h={sum,sum};

        for (int i = 0; i < caicount; i++)
        {
                sum=h;
                sum+=cai;
                if (sum>max)continue;
                h=sum;
                su(cai,caicount,sum,min,max,count);
                for (int j = 0; j < caicount; j++)
                {

                        if (i!=j)
                        {
                                sum=h;
                                sum+=cai;
                                if (sum>max)continue;
                                su(cai,caicount,sum,min,max,count);
                        }
                }
        }

}
void tangandmifan(int **cai,int *caicount,int sum,int min,int max,int *count)
{

        for (int i= 0; i < caicount; i++)
        {

                for (int j = 0;j < caicount;j++)
                {
                        sum=0;
                        sum+=cai+cai;
                        if (sum>max)continue;
                        hun(cai,caicount,sum,min,max,count);

                }
        }

}
int main()
{
        int i,t,a,b,c,d,e,j,min,max,m,n,p,q,g,q1,g1;
        scanf("%d",&t);

        int num=0,sum=0,count=0;
        scanf("%d %d %d %d %d",&a,&b,&c,&d,&e);
        int *A=new int,*B=new int,*C=new int,*D=new int,*E=new int,*cai={A,B,C,D,E},caicount={a,b,c,d,e};
        for(j=0;j<a;j++)
                scanf("%d",&A);
        for(j=0;j<b;j++)
                scanf("%d",&B);
        for(j=0;j<c;j++)
                scanf("%d",&C);
        for(j=0;j<d;j++)
                scanf("%d",&D);
        for(j=0;j<e;j++)
                scanf("%d",&E);
        scanf("%d %d",&min,&max);
        tangandmifan(cai,caicount,sum,min,max,&count);

        for (i = 0; i < caicount; i++)
        {
                sum=cai;
                if (sum>max)continue;
                hun(cai,caicount,sum,min,max,&count);
        }
        printf("%d",count);
        for (i = 0; i < 5; i++)
        {
                delete[] cai;
        }
        return 0;
}
页: [1]
查看完整版本: 一直超时,也没有输出问题,请问怎么改?