鸡兔同笼:Time Limit Exceeded?试着把时间复杂度降下来吧

来源:互联网 发布:快读总是网络错误 编辑:程序博客网 时间:2024/03/29 04:44

北大-计算概论-练习-鸡兔同笼

http://ica.openjudge.cn/base1/5/

【一开始的解答】

#include<stdio.h>main(){int repeat,a,min,max,ri,i,j,flag;scanf("%d",&repeat);for(ri=0;ri<repeat;ri++){scanf("%d",&a);min=a;max=0;flag=0;for(i=0;i<=a;i++){for(j=0;j<=a;j++){if(2*i+4*j==a){flag=1;if(i+j<min)                   min=i+j;                    else if(i+j>max)                       max=i+j;}}}if(flag==1)    printf("%d %d\n",min,max);        else            printf("0 0\n"); }}

提交之后,总是提示Time Limit Exceeded.

【然后】

#include<stdio.h>main(){int repeat,a,min,max,ri,i,j,flag;scanf("%d",&repeat);for(ri=0;ri<repeat;ri++){scanf("%d",&a);min=a;max=0;flag=0;for(i=0;i<=a/2;i++)//变化在这里{for(j=0;j<=(a-2*i)/4;j++)//还有这里{if(2*i+4*j==a){flag=1;if(i+j<min)                   min=i+j;                    else if(i+j>max)                       max=i+j;}}}if(flag==1)    printf("%d %d\n",min,max);        else            printf("0 0\n"); }}

还是不对

【正确解答】

问题的关键,在于前面的程序的时间复杂度都是O(n^2)

于是,我们试着减少一层for循环的嵌套

#include<stdio.h>main(){int repeat,a,min,max,ri,i,flag;scanf("%d",&repeat);for(ri=0;ri<repeat;ri++){scanf("%d",&a);min=a;max=0;flag=0;for(i=0;i<=a/2;i++){if((a-2*i)%4==0&&(a-2*i)/4>=0){flag=1;if(i+(a-2*i)/4<min)                   min=i+(a-2*i)/4;                    else if(i+(a-2*i)/4>max)                       max=i+(a-2*i)/4;}}if(flag==1)    printf("%d %d\n",min,max);        else            printf("0 0\n"); }}

AC.

0 0