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的训练。
难度才慢慢的加强,既然选择了,就要做出成绩。