• 1752:鸡兔同笼(2.1)


    最朴素的方法:

    #include<cstdio>
    int main(){
        int a,maxn=-1,minn=32769;
        scanf("%d",&a);
        if (a%2==0) maxn=a/2;
        if (a%4==0) minn=a/4;
        for (int t=1;t<=a/4;t++)
            for(int j=1;j<=a/2;j++)
                if(4*t+2*j==a){
                    if (t+j<minn) minn=t+j;
                    if (t+j>maxn) maxn=t+j;
                } 
        if (maxn==-1&&minn==32769) printf("0 0
    ");
        else     printf("%d %d
    ",minn,maxn);
        return 0;
    }
    View Code

    时间:32768/4*32768/2=134217728~1*108

    如果测试数据过大未必能通过

    简单优化:

    #include<cstdio>
    int main(){
        int a,maxn=-1,minn=32769;
        scanf("%d",&a);
        if (a%2==0) maxn=a/2;
        if (a%4==0) minn=a/4;
        if (a%2>0){
            printf("0 0
    ");
            return 0;
        }
        if (maxn==-1||minn==32769) {
        for (int t=a/4;t>=0;t--)
            for(int j=1;j<=a/2;j++)
                if(4*t+2*j==a){
                    if (t+j<minn) minn=t+j;
                    if (t+j>maxn) maxn=t+j;
                } 
        }
        if (maxn==-1&&minn==32769) printf("0 0
    ");
        else     printf("%d %d
    ",minn,maxn);
        return 0;
    }
    View Code

     继续优化:保留一重循环

    如果有解则a定为偶数,则最大值定为a/2。如果a%4==0则最小值为 minn=a/4;

    //如果有解则a定为偶数,则最大值定为a/2。如果a%4==0则最小值为 minn=a/4;
    #include<cstdio>
    int main(){
        int a,maxn=-1,minn=32769;
        scanf("%d",&a);
        if (a%2==0) maxn=a/2;
        else {//如果a非偶肯定无解 
            printf("0 0
    ");
            return 0;
        }
        if (a%4==0) minn=a/4;
        if (minn==32769) 
            for (int t=1;t<=a/4;t++){
                int j=(a-4*t)/2;
                if (t+j<minn) minn=t+j;
            }            
    //    if (maxn==-1&&minn==32769) printf("0 0
    ");
        printf("%d %d
    ",minn,maxn);
        return 0;
    }
    View Code
    三种方法的时间复杂度:

     

    思考:

    可以不用循环来实现吗?

    最小值肯定是腿先分配给兔子,剩下不够的才能分配给鸡。(其实最多剩2只腿,也就是说最多有1只鸡)

    那么兔子的数量为a/4,鸡的数量为(a%4)/2,则最小值为:a/4+(a%4)/2。

    #include<cstdio>
    int main(){
        int a,maxn=-1,minn=32769;
        scanf("%d",&a);
        if (a%2>0){
            printf("0 0
    ");
            return 0;
        }
        maxn=a/2;
        minn=a/4+(a%4)/2;
        printf("%d %d
    ",minn,maxn);
        return 0;
    }
    View Code
  • 相关阅读:
    [转载]tlb、tlh和tli文件的关系
    [转载]美国不是中国唯一的榜样
    使用spring.net 1.3.2框架部署在虚拟目录上发生错误
    用Log4Net记录NHibernate中执行的SQL语句及执行时间
    IIS7/8 HTTP Error 500.19 错误 0x80070021
    IE下点击scrollbar会导致焦点移动到body
    性能测试学习(一)--基础知识点
    测试基础知识点汇总
    如何制定测试计划
    《软件测试经验与教训》摘录
  • 原文地址:https://www.cnblogs.com/ssfzmfy/p/5192449.html
Copyright © 2020-2023  润新知