每天一遍
1.迭代
void add(int a , int b , int c) { e[idx] = b , w[idx] = c , ne[idx] = h[a] , h[a] = idx++; }
int gcd(int a , int b) { return b ? gcd(b , a%b) : a; }
2.二分
int l = 0 , r = n - 1; while (l < r) { int mid = l + r + 1 >> 1; if (check(mid)) l = mid; //如果是l = mid,上面就要+1 else r = mid - 1; }
3.数据结构
3.1 小根堆,PII
#include <queue> typedef pair<int , int> PII; int main() { priority_queue<PII , vector<PII> , greater<PII>> heap; }
3.2 重载小于号
const int N = 5e6+10; int m; struct Sum//定义结构体 { int s , c , d; bool operator < (const Sum &t) const { if (s < t.s) return s < t.s; if (c < t.c) return c < t.c; return d < t.d; } }sum[N]; int main() { for (int c......; c++) for (int d......; d++) sum[m++] = {c+d , c , d};//插入
sort(sum , sum+m);//排序 ...... }
4.数学常识
4.1 如果两个数 p、q 互质
则他们不能凑出来的最大的数就是 (p - 1) * (q - 1) - 1
比如3、5,不能凑出来的最大的数就是7
4.2 上取整
a / b 上取整,就是(a + b - 1) / b 下取整
也有一个库函数ceil,但是返回的是double 类型,需要强制转化成int,(int) ceil(a/b)
4.3 返回正余数
int get_mod(int a , int b) { return (a % b + b) % b; }
4.4 判断8位数字是否为合法日历
int d[] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; bool check(int num) { int year = num / 10000; int month = num % 10000 / 100; int day = num % 100; if (month < 1 or month > 12 or day < 1) return false; if (m != 2 and day > d[m]) return false; if (m == 2)//判断2月的天数是否合法 { int h = year % 100 and year % 4 == 0 or year % 400 == 0;//闰年为1,其余为0 if (day > 28 + h) return false; } }
4.5 写itoa函数,把十进制转化为a进制的数
string itoa(int num , int a) { string s; do{ int t = num % a; if (t >= 0 and t <= 9) s += t + '0'; else s += t - 10 + 'A'; //可以小写,看具体情况 num /= a; }while (num); reverse(s.begin() , s.end()); return s; }
atoi函数,将a进制转化为十进制
int atoi(string s , int a) { int ans = 0; for (int i = 0 ; i < s.size() ; i++) { char t = s[i]; if (t <= '9' and t >= '0') ans = ans * a + t - '0'; else ans = ans * a + t - 'A' + 10; //注意大小写 } return ans; }
4.6 快速幂
//求 a 的 b 次方余 p 的值 while (b) { if (b & 1) res = res * 1ll * a % p; //1ll , 方便转换成long long a = a * 1ll * a % p; b >>= 1; //中间没有空格 }
4.7快筛法求质数
int primes[N] , cnt; bool st[N]; void get_primes(int n) { for (int i = 2 ; i <= n ; i++) { if (!st[i]) primes[cnt ++] = i; for (int j = 0 ; primes[j] * i <= n ; j++) { st[primes[j] * i] = true; if (i % primes[j] == 0) break; } } }
4.8 求一个数的二进制表示有多少个1
int get_count(int x) { int res = 0; while (x) { res++; x -= x & -x; } }
5.错误原因
1.Segmentation Fault
很有可能是 scanf 没有加 & 取地址符
本文作者:乐池
本文链接:https://www.cnblogs.com/ratillase/p/15989534.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步