• 2019/02/09训练日记


    一,吃葡萄

    在房间中G颗葡萄,现在有n个人。这n个人依次进入房间吃葡萄。每个人进去的时候都做如下操作,把葡萄分成n等份,发现还多出一颗,然后吃掉这一颗以及n等份中的一份,然后走出房间。这n个人吃完之后,最后房间里面的葡萄刚好可以分成n等分。问n最大是多少?
    输入
    多组测试数据。
    第一行输入一个整数T(1<=T<=200),表示测试数据的数目。
    接下来T行,每一行一个整数G(1<=G<= 4000)
    输出
    对于每一组数据,输出一个整数表示最大的人数,如果无解输出No Solution。
    输入样例
    样例输入1
    2
    25
    30
    输出样例
    样例输出1
    3
    No Solution

    运行效率榜单第一

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<math.h>
    #include<cstring>
    #include<iomanip>
    using namespace std;
    int main()
    {
        int n,m,i,k,j,t,a,b,c,x,y,flag=0;
            scanf("%d",&n);
            for(i=0;i<n;i++)
            {
                flag=0;
                scanf("%d",&t);
                for(j=t;j>=2;j--)
                {
                    a=t;
                    b=0;
                    for(k=j;k>=1;k--)
                    {
                          m=a-1;
                          if(m%j!=0)
                              k=0;
                              else
                              {
                               a=m-(m/j);
                               b++;
                              }
                    }
                    if(b==j&&a%j==0)
                    {
                        printf("%d
    ",j);
                        flag=1;
                        break;
                    }
                }
                if(flag==0)
                printf("No Solution
    ");
            }
        return 0;
    }
    

    我的代码

    #include<cmath>
    #include<iostream>
    #include<iomanip>
    using namespace std;
    int putao(int a);
    int main()
    {
        int lm[2000];
        int a,b;
        cin>>a;
        for(int t=0;t<a;t++)
        {
            cin>>lm[t];
            if(lm[t]==3) cout<<2<<endl;
            else if(putao(lm[t])==0) cout<<"No Solution"<<endl;
            else cout<<putao(lm[t])<<endl;
        }
        return 0;
    }
    int putao(int a)
    {
        //begin :
        int c[4000];
        int q=0;
        for(int i=2;i<=a/2;i++)
        {
            if((a-1)%i==0)
            {
                c[q]=i;
               // cout<<i<<endl;
                q++;
            }
        }
        for(int i=q-1;i>=0;i--)
        {
            int w=1;
            int zx=a;
            for(int t=0;t<c[i];t++)
            {
                zx=zx-1;
                if(zx%c[i]!=0)
                {
                   // cout<<"jiade"<<endl;
                    w=0;
                    break;
                }
                zx=zx*(c[i]-1)/c[i];
              // cout<<zx<<endl;
            }
            if(w==1&&zx%c[i]==0)
            {
                return c[i];
            }
        }
        return 0; 
    }
    

    分析两端代码,均采用了模拟法,不难看出除了我使用了函数外几乎没有太大差别。而我犯了一个致命的错误,采用一轮循环后将因数存入数组,在调用,在循环,大大耽误了时间,可以分解出质因数后直接判断。对自己函数修改如下:
    1.输入输出采用效率更高的scanf printf;
    2.采用循环一次的模拟法。
    3.函数返回值为int型,还需根据返回值做出判断,多出的一个if语句对效率影响不大。

    #include<cmath>
    #include<cstdio>
    #include<iostream>
    #include<iomanip>
    using namespace std;
    int putao(int a);
    int main()
    {
        int l;
        int a,b;
        scanf("%d",&a);
        for(int t=0;t<a;t++)
        {
            scanf("%d",&l);
            if(putao(l)==0) printf("No Solution
    ");
            else printf("%d
    ",putao(l));
        }
        return 0;
    }
    int putao(int a)
    {
        for(int i=a;i>=2;i--)
        {
            if((a-1)%i==0)
            {
                int w=1;
                int zx=a;
                for(int t=0;t<i;t++)
                {
                    zx=zx-1;
                    if(zx%i!=0)
                    {
                        w=0;
                        break;
                    }
                    zx=zx*(i-1)/i;
                }
                if(w==1&&zx%i==0)
                {
                    return i;
                }
            }
        }
        return 0;
    }
    

    二、STL训练

    第一个题,全英文。fls说以后都会是这种题,要适应。读题读了15分钟,才看明白题。然后要用STL,首先对于STL部分的知识,还不是很熟悉,遇见题总想用数组去解决,第一目前所想的解法不一定是最优解,第二这是STL的训练。
    难度才慢慢的加强,既然选择了,就要做出成绩。

  • 相关阅读:
    shell脚本
    centos7.6通过单用户模式重置密码
    小端
    malloc函数
    float和double数据EEPROM存储
    分享一个的c++写的,模仿awk的框架类CAwkDoc
    简单自测项目pom配置,log4j配置
    idea 启动项目,maven打包错误整理
    docker,docker-compose常用命令及部署
    jrebel启动项目报Incompatible magic value 0 in class file错误
  • 原文地址:https://www.cnblogs.com/lunatic-talent/p/12799107.html
Copyright © 2020-2023  润新知