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\n",j);
                    flag=1;
                    break;
                }
            }
            if(flag==0)
            printf("No Solution\n");
        }
    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\n");
        else printf("%d\n",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的训练。
难度才慢慢的加强,既然选择了,就要做出成绩。

posted @ 2019-02-09 23:05  风骨散人  阅读(78)  评论(0编辑  收藏  举报