2020年2月更新:算法模板V2.1版
下载地址
前言
本模板是我在备战省赛的时光中,把复习过的和新学的算法中比较常用的代码、思路,整合成了模板,供以后的ACM竞赛直接使用,因为时间匆忙、水平有限,若有不足之处,欢迎大佬提出。本版本为V1.0版,会不定期更新。
以下所有代码都是我个人手敲,并且通过HDU、POJ等知名OJ上做题实践验证过的结果,是我两个月的成果。
水平有限,代码比较累赘,以后有机会进一步减少少考的算法,增加比较常用的算法合集。
希望能够抛砖引玉,如有意见,欢迎留言,或E-mail ypacmzwz@163.com
1.计算a到b之间有多少符合条件的数,可打表后二分找a和b的位置后相减
例:
代码语言:javascript复制scanf("%lld%lld", &n, &m);
i = lower_bound(s1.begin(), s1.end(), n) - s1.begin();
j = upper_bound(s1.begin(), s1.end(), m) - s1.begin();
printf("%lldn", j - i);
2.前缀和思想,不要直接暴力模拟。
3.(x1,y1)(x1,y1)(x2,y2)(x2,y2)两点连线之间的整点数是gcd(|x1−x2|,|y1−y2|) 1
4. 满足在[2,n]范围内有多少个数是非次方数(也就是不是x^k(k>1)这样的)
答案:
常见递推公式
f(n)=4*f(n-2)-f(n-4)
f(n)=f(n-1) 6×(i-1)
f(n)=f(n-4) f(n-2) f(n-1)(n>4)
f[i]=f[i-1] f[i-2]*4;
f(n)=f(n-2) f(n-1),n>3。
F[i] = F[i-1] 2 * F[i-2];
a[n][m] = a[n-1][m] a[n][m-1]
函数库—algorithm
代码语言:javascript复制 //————————algorithm————————
int a[] = { 1, 3, 5, 7, 9, 11, 13 };
lower_bound(a, a 7, 7);//返回第一个大于等于7的地址
upper_bound(a, a 7, 7);//返回第一个小于等于7的地址
binary_search(a, a 7, 8);//若a到a 7有8,返回true 否则返回false
reverse(a, a 7);//反转a到a 7的元素
fill(a, a 7, 4);//填充函数,把a到a 7全部填充为4
int b[11] = { 1, 2, 3, 4 };
copy_backward(a, a 7, b 7);//把a数组复制到b,首地址,尾地址,复制后数组的尾地址
next_permutation(b, b 4);//b数组的下一个排列
prev_permutation(b, b 4);//b数组的上一个排列
replace(b, b 4, 3, 5);//把b到b 4中所有3替换成5
stable_sort(a, a 7, cmp);//按照cmp规则稳定排序a到a 7
unique(a, a 7);//去重,返回去重后数组的尾地址
printf("%dn", *max_element(a, a 6));//返回序列a到a 6的最大元素地址
//————————algorithm————————
函数库—cstring
代码语言:javascript复制//————————cstring————————
char a[200] = "hello world";
char b[] = "hello acm";
cout << a << endl << b << endl;
memset(a, 0, sizeof(a));//初始化 只能0 -1
int len = strlen(a);//返回a的长度 到'