鱼C论坛

 找回密码
 立即注册
查看: 2288|回复: 1

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

[复制链接]
发表于 2022-4-21 17:13:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#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[a],B[b],C[c],D[d],E[e];
                for(j=0;j<a;j++)
                scanf("%d",&A[j]);
                for(j=0;j<b;j++)
                scanf("%d",&B[j]);
                for(j=0;j<c;j++)
                scanf("%d",&C[j]);
                for(j=0;j<d;j++)
                scanf("%d",&D[j]);
                for(j=0;j<e;j++)
                scanf("%d",&E[j]);
                scanf("%d %d",&min,&max);
                for(q=0;q<d;q++)
                {
           for(q1=0;q1<d;q++)
           {
                   if(q==q1) sum1=D[q];
                   else sum1=D[q]+D[q1];
                   for(g=0;g<e;g++)
                   {
                       for(g1=0;g1<e;g++)
                       {
                               if(g==g+1) sum2=E[g];
                               else sum2=E[g]+E[g1];
                           for(m=0;m<a;m++)
                           {
                           for(n=0;n<b;n++)
                           {
                                   sum=0;
                                sum=sum1+sum2+A[m]+B[n];
                                   if(sum>=min&&sum<=max) num++;
                           }
                       }
                        for(p=0;p<c;p++)
                        {
                                sum=0;
                                sum=sum1+sum2+C[p];
                                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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[2]={sum,sum};
        for (int i = 0; i < caicount[4]; i++)
        {
                sum=s[0];
                sum+=cai[4][i];
                if (sum>max)continue;
                if(sum>=min)
                {
                        (*count)++;
                }
                s[1]=sum;

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

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

                        }
                }
        }

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

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

                        if (i!=j)
                        {
                                sum=h[1];
                                sum+=cai[3][j];
                                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[0]; i++)
        {

                for (int j = 0;j < caicount[1];j++)
                {
                        sum=0;
                        sum+=cai[0][i]+cai[1][j];
                        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[a],*B=new int[b],*C=new int[c],*D=new int[d],*E=new int[e],*cai[5]={A,B,C,D,E},caicount[5]={a,b,c,d,e};
        for(j=0;j<a;j++)
                scanf("%d",&A[j]);
        for(j=0;j<b;j++)
                scanf("%d",&B[j]);
        for(j=0;j<c;j++)
                scanf("%d",&C[j]);
        for(j=0;j<d;j++)
                scanf("%d",&D[j]);
        for(j=0;j<e;j++)
                scanf("%d",&E[j]);
        scanf("%d %d",&min,&max);
        tangandmifan(cai,caicount,sum,min,max,&count);

        for (i = 0; i < caicount[2]; i++)
        {
                sum=cai[2][i];
                if (sum>max)continue;
                hun(cai,caicount,sum,min,max,&count);
        }
        printf("%d",count);
        for (i = 0; i < 5; i++)
        {
                delete[] cai[i];
        }
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-5 20:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表