onlinejudge例题讲解

onlinejudge例题讲解

ID:36302546

大小:228.00 KB

页数:22页

时间:2019-05-08

onlinejudge例题讲解_第1页
onlinejudge例题讲解_第2页
onlinejudge例题讲解_第3页
onlinejudge例题讲解_第4页
onlinejudge例题讲解_第5页
资源描述:

《onlinejudge例题讲解》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、OnlineJudge例题讲解南开ACM协会http://acm.nankai.edu.cn1002:[NKPC1]Lucy的难题f(n)当n>=50025002的时候,f(n)=n-5;当n<50025002的时候,f(n)=f(f(n+2005))。现在请您试试编程解决Lucy的难题!初步想法:intf(intn){if(n<50025002)returnf(f(n+2005)); returnn-5; }RuntimeError1002:[NKPC1]Lucy的难题错误原因:递归层数太多,栈溢出简单的改进----->递归化为循

2、环用m表示f的层数,f(m,n)表示参数n嵌套了m层f,例如f(3,n)=f(f(f(n))) f(1,n)=f(n) f(0,n)=nwhile(1==scanf("%d",&n)){m=1;while(m>0){if(n>=50025002){n=n-5;--m;}else{n+=2005;++m;}}printf("%d",n);}1002:[NKPC1]Lucy的难题进一步改进设k<50025002但k+2005>=50025002 f(1,k)=f(2,k+2005)=f(1,k+2000)也即f(k)=f(k+200

3、0)设k+2005*m<50025002但k+2005*(m+1)>=50025002时有f(1,k)=f(1,k+2000)1002:[NKPC1]Lucy的难题当k+2005*(m+1)<50025002但k+2005*(m+2)>=50025002时f(1,k)=f(2,k+2005)=f(2,k+2005+2000*t) =f(1,k+2000*(t+1))进一步可知f(k)=f(k+2000)仍然成立这样得到一个简单的方法,如果n<50025002,将n累加2000,直到超过50025002即可,代码略1263:粗心的物理

4、学家计算1+1/2+1/3+…+1/n其中n<=5*10^6输入n输出计算结果,保留12位小数doubles;//记录最终计算结果inti,j;1263:粗心的物理学家while(scanf("%d",&j)==1){s=0;for(i=1;i<=j;++i)s+=1./i;printf("%.12lf",s);}WrongAnswer为什么?1263:粗心的物理学家精度问题利用C++计算1e10+1e-10并保留12位小数:printf(“%.12lf”,1e10+1e-10);结果为10000000000.0000000

5、00000原因是double本身精度有限如果将上述程序中的循环改为for(i=j;i>=1;--i)s+=1./i;则AC1023:A+B+C+D+...的挑战输入有多行数据,每行有若干整数,这些整数数以空格分割,请分别求出每行整数的和。SampleInput10020044545SampleOutput304901023:A+B+C+D+...的挑战如果用普通的读入方法读入整数,则无法知道什么时候是一行的结束有很多处理方法,这里介绍用getchar()getchar()无参数,它读入一个字符,可以是转义字符,返回值为int型,表示

6、ASCII思考:getchar()返回值为什么不是char?1023:A+B+C+D+...的挑战intsum,a;charch; //sum为结果,a为当前数ch=getchar()反复读入字符,有以下几种情况1,ch>=‘0’&&ch<=‘9’,则a=a*10+ch-’0’;2,ch==‘’,一行读入结束,则输出sum3,ch==‘‘,当前数读入结束,sum+=a;a=01023:A+B+C+D+...的挑战也可以利用cin.getline函数读入一整行,包括空格,或者gets函数也可以得到相同效果读入一整行之后,可以同样采

7、取上述方法解题,但如果熟悉strtok函数的话实际上还有更好的做法,留作自学1046:正整数划分问题将一个正整数n表示成一系列正整数的和,如:N=n1+n2+…+nk(其中n1≥n2≥…≥nk≥1,k≥1) 正整数n的一个这种表示成为正整数n的一个划分。 现在给出一个正整数n(80≥n≥1),求n的不同划分一共有多少种。1046:正整数划分问题假设n已经划分出一个数字为n1,则n-n1的划分成为一个子问题,因此可以考虑动态规划(DynamicProgramming=DP)但是n-n1的划分必须满足一个条件:划分出的最大数字不超过n1

8、,因此我们可以设dp[i][j]表示将i进行划分,划分出的最大数字不超过j的种类1046:正整数划分问题初始值a[1][i]=1,a[i][1]=1(i>=1) a[0][i]=1(i>=0)思考这里为什么不设为=0递推a[i][j]

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。