心得体会
- UVaOJ网站:http://uva.onlinejudge.org/
- 声明数组只有在main函数外才能开得很大,放在main内会异常退出。
- 编程过程中只要出现对多组数据的处理,都可以考虑用数组存储。
- 网格问题用二维数组存储,用二维数组作为参数的时候要声明第二个维度(列)的大小。
- 标志变量(flag):
经常与while,if一起使用,多种情况下用同一种处理方式,用flag把这些case统一起来,最后一起处理。 - 在往数组里面填数时可以先把数组置零,便于判断数组是否为空。
- *和&理解:int a=10;int *b=&a; a=*b=10,&a=b=6487620。a表示a对应存储单元的数据,&a表示a对应存储单元的地址,*a:要求a对应存储单元的数据是另一个存储单元的地址,*a表示另一个存储单元的数据。*a等同于a【】。
算法、函数积累
-
在默认情况下,for语句的循环体只有一条语句,使用花括号,花括号内的语句才会作为循环体。
-
从数组a赋值k个元素到数组b:memcpy(b,a,sizeof(int)*k),注意包含头文件<string.h>。
-
scanf("%s",s)——读入一个不含空格,tab和回车符的字符串,遇到空白字符会停止,所以可以用getchar。
-
fprint输出到文件,sprint输出到字符串,strchr在一个字符串查找单个字符。
-
生成元算法
while(j>0) { s+=j%10; j/=10; }
-
字典序:abc<bcd,hi<history,1,2,4,7<1,2,5。
-
isalpha()函数:如果参数是字母字符,函数返回非零值,否则返回零值。头文件include<ctype.h>。
-
break,continue:当循环中遇到break语句时,立即结束循环,调到循环体外,执行循环结构后面的语句;continue:跳过本次循环。多与if连用。
-
fgets()函数:charfgets(chars,int n,FILE*stream);
s:字符型指针,指向存储读入数据的缓冲区的地址。n:从流中读入n-1个字符,stream:指向读取的流。
课后练习的反思
- 任何看起来比较复杂的竞赛题大部分都是由基本的功能和操作组合起来的,所以基本功扎实显得格外重要,《算竞》五十五页的思考题1是初学者本章练手的最好题目。
- 3-1得分题用两个数组分别存储比较方便,可以先把规则提前编好,这样代码清晰直观。
- 3-2分子量需分情况讨论CHON分别开头,注意判断下标是两位数的情况,字符数组里面的数值可以用ascll码计算。
- 3-3数数字——遇到统计某些元素出现次数的情况可以吧这些元素放到数组里面,再进行比较。
- 3-4周期串——可以根据题目样例输入的漏洞使用简单的算法。。
- 3-5谜题——for(){for(){}}遍历整个数组,考察二维数组之中元素位置的交换。
- 3-7DNA序列——竖着比较,多个变量用结构体。
- 3-8循环小数——超出精度的部分可以存入到数组。
- 3-9子序列——
int i=0,j=0; while(i<strlen(s)&&j<strlen(t)){ if(s[i]==t[j]) j++; i++;//模拟删除字符 }//用i,j遍历s[],t[]
- 任何数组中有比较大小的题目可以都先排序一波,然后指定位置输出
void sort(int a[],int size) {int i,j,x; for(i=0;i<size;i++){for(j=i;j>0;j--){if(a[j]<a[j-1]){x=a[j];a[j]=a[j-1];a[j-1]=x;}}}}