论 C++ 在OpenJudge中做题的易错点(一)
来源:互联网 发布:苗阜精神状态知乎 编辑:程序博客网 时间:2024/05/18 17:57
论点一: Runtime Error
这个在OpenJudge中可能很常见,但最多的情况为:数组开小了、运行时间过长(代码冗长、方法没用对、情况考虑不到位以至于计算范围得扩大)等等
例如:
状态: Runtime Error
源代码:
//此题解为 02:奇数单增序列
include<cstdio>include<algorithm>using namespace std;int a[10],b[10];int main(){ int m=0,x=0,y=0; int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) { if(a[i]%2!=0) { x++; b[x]=a[i]; } } sort(b,b+x+1); for(int i=1;i<=x-1;i++) printf("%d,",b[i]); printf("%d",b[x]); }
修改后:
状态: Accepted
#include<cstdio>#include<algorithm>using namespace std;int a[5000],b[5000];int main(){ int m=0,x=0,y=0; int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) { if(a[i]%2!=0) { x++; b[x]=a[i]; } } sort(b,b+x+1); for(int i=1;i<=x-1;i++) printf("%d,",b[i]); printf("%d",b[x]); }
察觉方法:1.注意读题,一般在题中都会提到某些未知数的范围,这时,我们就要注意,在开始写代码的时候就将数组大小调整好.也可以在代码写完后再读题、查错(但不建议这么做)。当然,还有一些‘懒猪’,在一开始时就将数组开得特别大(比如说。。。我~),但是,虽说这么做方便、快捷,但有时,还是会消耗许多时间,浪费许多空间。所以,我们都得一起努力,改掉这些坏习惯。(有则改之,无则加勉)
在最后,我再给大家举一个典型的例子(数组开小):
状态: Runtime Error
源代码
//此题为 7218:献给阿尔吉侬的花束
#include<iostream>#include<cstdio>#include<cstring>using namespace std;int f[400][400],n,m,i,j;int head,tail,q[40005],p[40005],x,y,x1,y1,b[40005];int xx[10]={-1,0,1,0},yy[10]={0,-1,0,1};int main(){ int l; scanf("%d",&l); while(l--) { scanf("%d%d",&m,&n); memset(f,0,sizeof(f));//清空 memset(b,0,sizeof(b));//清空 memset(p,0,sizeof(p));//清空 memset(q,0,sizeof(q));//清空 for (i=1;i<=m;i++) { char c[100];//***同志们注意看这里*** scanf("%s",c);//输入矩阵 for(j=1;j<=n;j++) { if (c[j-1]=='.') f[i][j]=1; if (c[j-1]=='#') f[i][j]=0; if (c[j-1]=='S') { x=i; y=j; f[i][j]=1;//并改为1 } if (c[j-1]=='E') { x1=i; y1=j; f[i][j]=1; } } } head=0;tail=1;p[tail]=x;q[tail]=y;b[tail]=0;// i,j 初始位置 bool pd=0; while (head<tail) { head++; for(i=0;i<=3;i++) { int l=xx[i]+p[head]; int r=yy[i]+q[head]; if (l>0&&l<=m&&r>0&&r<=n&&f[l][r]==1) { f[l][r]=0; tail++; p[tail]=l; q[tail]=r; b[tail]=b[head]+1; } if (l==x1&&r==y1) { cout<<b[tail]<<endl; pd=1; break; } } if (pd==true) break; } if (pd==false) cout<<"oop!"<<endl; }}
修改后:
状态: Accepted
源代码
#include<iostream>#include<cstdio>#include<cstring>using namespace std;int f[400][400],n,m,i,j;int head,tail,q[40005],p[40005],x,y,x1,y1,b[40005];int xx[10]={-1,0,1,0},yy[10]={0,-1,0,1};int main(){ int l; scanf("%d",&l); while(l--) { scanf("%d%d",&m,&n); memset(f,0,sizeof(f));//清空 memset(b,0,sizeof(b));//清空 memset(p,0,sizeof(p));//清空 memset(q,0,sizeof(q));//清空 for (i=1;i<=m;i++) { char c[4000]; scanf("%s",c);//输入矩阵 for(j=1;j<=n;j++) { if (c[j-1]=='.') f[i][j]=1; if (c[j-1]=='#') f[i][j]=0; if (c[j-1]=='S') { x=i; y=j; f[i][j]=1;//并改为1 } if (c[j-1]=='E') { x1=i; y1=j; f[i][j]=1; } } } head=0;tail=1;p[tail]=x;q[tail]=y;b[tail]=0;// i,j 初始位置 bool pd=0; while (head<tail) { head++; for(i=0;i<=3;i++) { int l=xx[i]+p[head]; int r=yy[i]+q[head]; if (l>0&&l<=m&&r>0&&r<=n&&f[l][r]==1) { f[l][r]=0; tail++; p[tail]=l; q[tail]=r; b[tail]=b[head]+1; } if (l==x1&&r==y1) { cout<<b[tail]<<endl; pd=1; break; } } if (pd==true) break; } if (pd==false) cout<<"oop!"<<endl; }}
当然,数组开小并不是唯一的错误,像运行时间过长(代码冗长、方法没用对、情况考虑不到位以至于计算范围得扩大)这些问题还是存在的,但这些问题的解决方案也还是只有自己,修改代码。就像在做广搜的题时,你用深搜的方法去做,一一列举,如此,就有可能时间超限。
阅读全文
1 0
- 论 C++ 在OpenJudge中做题的易错点(一)
- OpenJudge百炼习题解答(C++)--题4072:判断多个点是否在同一直线
- C语言题 救援(OpenJudge)
- OpenJudge百炼习题解答(C++)--题4110:圣诞老人的礼物-Santa Clau’s Gifts
- OpenJudge百炼习题解答(C++)--题4045:与3和5无关的数
- OpenJudge百炼习题解答(C++)--题3142:球弹跳高度的计算
- OpenJudge 全在其中
- 【Openjudge】全在其中
- 【OpenJudge】c语言_计算2的幂
- [openjudge]数据包的调度机制(dp)
- openjudge 3468 电池的寿命(规律)
- OpenJudge百炼习题解答(C++)--题2000:金币
- OpenJudge百炼习题解答(C++)--题4010:2011
- OpenJudge百炼习题解答(C++)--题3858:和数
- openjudge 去除C程序中的注释(大模拟)
- OpenJudge百炼习题解答(C++)--题1936:全在其中
- OpenJudge百炼-1936-全在其中-C语言-字符串处理
- openjudge树的转换
- spring-boot 集成 redis
- 【Android】【bluetooth 】如何记住蓝牙地址名字和状态
- Javascript中bind()方法的使用与实现
- Python3 BeautifulSoup爬虫 HDU自动提交
- 表单控件 文本框 title overall type: UNKNOWN_TYPE server type: NO_SERVER_DATA
- 论 C++ 在OpenJudge中做题的易错点(一)
- opencv3.2的cuda重新编译教程
- SQL Function 自定义函数
- Android中时间、日期的计算方法
- Java正则表达式-基础
- Logrotate操作手册
- web如何制作验证码功能
- 经典设计模式(附实例和详解)
- 刷新组件RENDER(重新渲染)的三种方式详解