断断续续也做了30多个题了,不总结一下乱做也没效果,有一些还是要背一背的
♦ 1002 有一个输出问题, 注意输出格式, 尽量多用scanf printf ,做到现在基本只有在用到string的时候只能cin cout 。
♦ 开数组大小的时候要考虑全面,有些时候不通过或者显示段错误的话就把数组再开大点。。
♦ 目前遇到的dijkstra题都还没去研究,,接下来这几天的目标就是继续刷题,然后像动态规划,图论,贪心算法这种还没学模板性质的题学习一下。
♦ 巧妙应用string,好多题都可以直接用string简化运算,string可以用数组下标访问,可以直接比较大小,直接进行加减法,reverse函数可以吧把string直接反转。
♦ 有几次编译器报错的时候,是变量名的问题,目前遇到的有begin,rank ,都是不可以拿来做变量名的。
♦取整,四舍五入。之前有过的坑点是有一些会5舍6入,解决的办法是+0.001。还有几个函数在cmath
里面
ceil(a) 向上取整
floor(a) 向下取整
round(a) 四舍五入
♦ 结构体排序,常见题型。1028, 1012
自定义比较函数,从大到小排就‘>’。
当出现 “如果分数相同,就按学号升序输出” 类似问题,就在比较函数里排序就可以。
bool myscore(stu a, stu b){
if(a.score == b.score) return a.num < b.num;
else return a.score < b.score;
}
排名名次问题
arr[0].rank = 1;
for(int i=1; i<l; i++){
if(arr[i].score == arr[i-1].score) arr[i].rank = arr[i-1].rank;
else arr[i].rank = i+1;
}
♦ dfs求连通分量问题
int arr[100][100];
int brr[100];
void dfs(int i){
brr[i] = 1; //表示走过了这个点;
for(int j=0; j<n; j++){
if(arr[i][j] == 1 && brr[j] == 0)
dfs(j);
}
}
int main(){
for(int i=0; i<n; i++){
if(brr[i] == 0){
dfs(i);
sum++;
}
}
return 0;
}
♦ 模拟的题还没咋再练练,就是对STL的熟练运用吧。
♦ 素数判断,注意等号
int isprime(int a){
for(int i=2; i*i <= a; i++){
if(a%i==0) return 不是素数;
}
return 是素数;
}
♦ 进制转换
do{
arr[l++] = n%d;
n /= d;
}while(n != 0);
for(int i=0; i<l; i++){
n = n*d + arr[i];
}
写累了,还有十多道题没总结完。。
♦ 用cin cout超时又需要存储字符串的话用char数组,比较用 strcmp() , 大小用 strlen()。
strcmp( a, b );
a == b 返回 0
a > b 返回 >0
a < b 返回 <0
♦ 根据后序中序求前序(多理解几次!)
void pre(int root,int start, int end){
if(start > end) return;
int i = start;
while(i < end && 中序[i] != 后序[root]) i++;
printf("%d ",后序[root]);
pre(root - 1 - end + i,start,i-1);
pre(root - 1, i + 1, end);
}
♦ STL指针
个人理解为模板形式
set/vector...<int>::iterator it;
for(it = s.begin(); it != s.end(); it++)
printf("%d",*it);
♦ STL模板 nth_element
可以用来取中间数
#include <algorithm>
nth_element(arr.begin(),arr.begin+(l-1)/2,arr.end());
♦ vector 初始化用resize();
——8.14 总结到1037——